空值非常麻烦,Java中的空指针异常让人崩溃,Java程序中还是遍布null检查。
** null是一个讨厌鬼 **
null语义不明,通常null什么都不能代表,而又什么都能代表。如果你不检查,空指针异常必定会蹦出来。
对于集合类型来说,空有两种含意:
1、变量是空引用,也就是变量没指向一个集合类型。
2、集合中元素数量为0。
所以经常我们要检查 list != null && list.size() > 0
对于空值最常用的办法就是:不相信任何输入输出值,每个一参数都需要检查。
这样可以解决问题,但是出现另一个棘手的事情:
- 增加代码长度
大部分代码都是在检查空值上面;一个方法100行代码,有50行是检查各种参数,49进行异常处理,1行调用方法进行业务处理。这是什么事儿啊。
- 减少写代码的乐趣
注意力集中的时间段是非常保贵的。现在的互联网公司,办公区开放、各部分门的混坐一起,一个程序员从早到晚不停的被打扰,8小时工作时间能集中精力2个小时已经很不容易了。而这短短的有效时间内,还要编写大量的防御性代码,对于我来说,大量编写这样的代码经常会让我思路分散,导致我在真正的业务代码上面出错。
** 这个问题怎么破?**
实话是很难破,多年编码后也仅仅总结了几个做法可以减轻空值带来的痛苦
- 所有返回的集合对象都不返回null,而是返回size=0的空集合
- 除非null有特殊含意,方法返回的普通对象都不为null
如从数据库查找对象的方法:findById
,这个返回null表示没有这个对象,可以返回null
- 使用基本的值类型,而不使用包装过的类型
使用int double 等等,不使用Integer
- 免不了有null时,使用guava中的Optional对象
可以方便的检查和操作null,JDK8以后也在java.util包中增加了Optional对象。
- 集合对象中不保存null
Map中不保存value为null的K-V对儿,也不用null做key。
- 使用高效工具对入参为null进行检查
如Guava中的Preconditions类这样的检查工具,大大减少代码量。
以上只是自己在写程序过程中的一些感受,如果有同行朋友有建议,请留言,谢谢!