guava深入理解(1)-null处理

guava是一个基础型的类库,就是他不是针对某一方面的应用开发的(例如okhttp专门用于网络通信),而是为了弥补java语言的一些设计不好的地方,或者某些缺失的特性,当然,因为guava开发的时候是java6,但现在已经java9了。所以guava里所提供的一些功能已经被java语言自身的改善弥补了,目前java还有一些特性的缺失则可以使用其他jvm语言弥补(例如kotlin),这个我们后面会讲到。

guava除了使用之外,它的源码以及设计理念也非常值得学习,而且因为guava各个功能部分都是分开的,所以互相之间没有很紧密的联系,看起来还是比较轻松的,也能学到很多东西。实际上,guava里面很多类库,即时自己实现,也用不了多久,但是类库里蕴含的那种编程哲学,却是需要深入理解的。

(guava类似apache的common类库,不过个人觉得比那个好用。)

处理NULL

在一个语言的类型系统里,一个变量是什么类型代表了它能做什么事,例如字符串类型可以拼接其他字符串。而从这个角度来看,null几乎什么都做不了,所以将他和普通的类型混在一起,理论上就有很严重的问题。

null引用的发明者也这么说过

“I call it my billion-dollar mistake.” - Sir C. A. R. Hoare, on his invention of the null reference


但是并不是说null是没用的,只是需要把null和普通的类型区分开来,c#和kotlin所做的区分,就是

val a1:Int //abc不会为null
val a2:Int?//abc可能为null

实际上,任何变量都有可能为null,而我们的检查却往往不够,所以null引用也是出现频率最高的错误之一。但是手动进行检查,往往相当繁琐,这个时候就需要有类库或者语言级别的帮助。

实际上对null进行检测的类库层出不穷(或者是一个大类库的小部分),这说明对null的处理问题实际上是一个非常常见的问题。
而且很多语言都有考虑过这个问题,在语法级别增加了一些特性,例如c#的?类型,kotlin更进一层,默认使用非null类型(这也是我最喜欢kotlin的一点)

null还有一个问题就是,它本身的意义有限,任何类型就可以指向null,我们没法区分是一个String类型指向null,还是一个List类型指向null,而这种区分往往是有必要的。

guava以及其他很多类库甚至很多其他语言的解决办法都是使用一个Optional类,它代表了一个可能为null的值。
如果一个方法可能会返回null时,就返回一个optional类型,如果不可能会返回null,就不用optional类型,这样客户端在使用这个方法的时候就会有自觉了。
这个就和c#以及kotlin里的?类型是一样的意思

//optional可以标明类型
Optional<Integer> possible = Optional.of(5);
possible.isPresent(); // 是否有值
possible.get(); // 获得值

实际例子

 static public void main()
    {

         Optional<String> str=search(1);
           //检查返回的Optional是否有值
         if(str.isPresent())
         {
             //do sth
         }
    }
    //一个非常常见的查找方法,因为可能返回null,所以这里用optional代替
    private static Optional<String> search(int index) {

        return null;
    }

据guava官方的文档所说,在研究了大量代码后,发现只有5%的方法真正可以处理一个null参数,因此kotlin变量默认非null的决定是非常正确的,但是如果不使用kotlin,那么有必要做的一件事就是及早把null参数捕获出来,最好是在方法的入口点,就测试所有的参数是否为null(如果他不能为null的话),否则如果这个null引用在之后的代码里导致了错误,可能就更加难以查找到底哪里出错了。

guava基本上所有方法,都是拒绝null参数,传入后会直接报错,这种设计理念非常值得学习,及早报错,写代码时不要模棱两可。等到错误潜伏了很久后再在一个莫名其妙的地方报出来。

null还有一个问题是集合中的null,java现有的集合框架,都是可以添加null元素的,但是在实际情况下,几乎没有集合需要被真正的添加一个null元素,例如一个代表学生的集合,那么添加进一个null,意义何在?java集合框架的这个问题经常导致很多莫名其妙的Bug出现。kotlin里的集合默认就是不能传入null的,guava因为是一个类库,他没有办法改变java的集合,但是guava自带的一些集合类型,是不能传入null的。

当然,guava类库虽然提供了一些null检查的方法,但总归不如直接在语言级别支持来的方便,所以我强烈推荐大家使用kotlin,个人感觉kotlin对null类型的处理几乎是所有语言中最优雅的

guava还带了一些空字符串和null转换的方法,这也是bug频发的一个地方。这些方法的具体作用,看方法名就可以知道了

emptyToNull(String)
isNullOrEmpty(String)
nullToEmpty(String)

欢迎关注我的github
https://github.com/luckyCatMiao

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值