Guava是谷歌出品的一款JAVA工具框架,提供了很多丰富的工具类来弥补JAVA这门语言的不足之处。可以说将Guava就像是JAVA武侠世界的一本绝世秘籍,学会了它程序员可以轻松应对很多场景,用最少的代码实现业务逻辑。

第一节 使用和避免Null

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

上面是Null引用发明者亲口说的话,大意为:Null是我犯下的一个数百万美元的错误 可见连创始人本人都觉的Null是一个糟糕的发明。 那么Null到底糟糕在哪儿呢?

Null糟糕的地方

如下: - Null值的含义不明,比如Map.get(key)返回的Null值,即可以代表在Map中什么也没找到,也可以代表找到的value是Null。在很多程序中,Null可以代表失败,可以代表成功,可以代表任何事。 - Null值总是伴随着著名的NullPointerException,这个异常之所以著名的原因是因为通常它发生的时候,程序员很难定位错误的根源,只能靠瞎蒙

Null也有一些优点

当Null能被正确使用时,Null是很cheap的(应该就是几乎没有性能和空间开销)。 而且Null在数组对象中是不可避免的(这个我不认同原文观点,可以使用一个专用的引用来专门代表数组中空的元素,而不是通用的Null)

谷歌的建议

谷歌的建议是尽可能地在Null值出现的地方快速失败而不是忍气吞声把Null值接受下来。 我也认为这是个好建议,就地失败可以更容易查出根源问题,比Null值被好几个类传来传去以后才失败要好。

特殊例子的建议

谷歌还提出了以下建议: - 如果你打算使用Null放在一个Set里或者作为Map的key,请不要这么做。 - 如果你打算把Null值作为Map的Value放进去,请考虑分离开来,将Null键值对和非空的键值对分开放,或者维持一个非空键值对(或着空的)key的Set。因为很容易搞混到底是Map里面没有这个value,还是value就是Null。 - 如果你打算把Null放进List中,如果List不是很大,考虑使用Map<Integer,E>来代替List使用,这样更加高效,也许也更加符合你的应用的需求。 - 为枚举类型增加一种额外的枚举常量来代表Null值出现的情况,比如java.math.RoundingMode就用UNNECESSARY来代表不需要舍入,并在舍入的时候抛出异常。 - 如果你真的要使用Null,请使用Collections.unmodifiableList(Lists.newArrayList())来代替ImmutableList,因为后者对Null不友好

谷歌用来替代Null值的兵器——Optional

Guava框架提供了一个叫做Optional<T>的类,它用来包装某个非Null的类型,用来表达存在(present)和不存在(absent)这两个概念。 Optional所包装的对象,要么是存在,要么就是不存在,不会有第三种情况。 用法例子如下:

Optional<Integer> possible = Optional.of(5);
possible.isPresent(); // returns true
possible.get(); // returns 5

Optional提供的方法

首先是用来构造Optional的静态方法:

Untitled

然后还提供了一些非静态方法,在已经获得的对象上调用: