Guava学习之避免Null的使用

Null Sucks.__ Doug Lea

I call it my billion-dollar mistake.__ Sir C.A.R Hoare null指针发明人

编程中如果对null缺乏注意就会导致很多bug。通过对Google基础代码的阅读,我们发现,几乎95%的colletions中都不应该有null(空值)存在;对于开发者来说,如果null可以直接报错,会比默默地接收更加有益。

此外,null让人讨厌的一点在于它的表义模糊不清。当null作为一个返回值时,很难判断它的具体含义——比如,Map.get(key)返回null时,既可以表示Map中的值为空,又可以表示这个值不在Map中。Null可以表示失败,可以表示成功,可以表示几乎所有的状态。用别的东西来取代null会让你的代码更为清晰。

当然,很多时候用null也是正确的选择。从时间和空间的角度看,null都是廉价的,并且在Object array中是不可避免的。但相对于官方的library,在实际的Application代码中,null仍然是导致混淆,怪异bug和含糊不清的主要源头之一——比如,当Map.get返回null,可能说明不存在对应的值,也可能说明值存在且为null。最大的问题在于,null无法提示这个null值表示什么意思。

因此,很多Guava utility设计为对null值直接报错;只要有不用null的代替方案,就不允许null值。另外,Guava提供了一些工具来帮你避免使用null,同时在你不得不用时让使用null更容易。

具体例子

不要惊讶,即便是有特殊操作情况存在,你仍然不应该在Set中使用null或者在Map中把null作为参数传入。

如果你想在不考虑entry的情况下,将null作为一个参数传入Map,那你就需要保证含non-null key的Set与含null的Set分离(就是2个Set集啦)。当Map中包含key的entry的值为null,或者Map中的key没有entry,这两种情况是非常容易混淆的。更好的办法是直接将key进行分离,这样就很容易分辨实际应用中key为null时的含义了。

使用Map可能会比在一个稀疏的List中使用null效率更高,而且很可能前者更适合你实际应用中的需要。