你应该更新的Java知识之Optional
java.lang.NullPointerException,只要敢自称Java程序员,那对这个异常就再熟悉不过了。为了防止抛出这个异常,我们经常会写出这样的代码:
Person person = people.find("John Smith");
if (person != null) {
person.doSomething();
}
遗憾的是,在绝大多数Java代码里,我们常常忘记了判断空引用,所以,NullPointerException便也随之而来了。
“Null Sucks.”,这就是Doug Lea对空的评价。作为一个Java程序员,如果你还不知道Doug Lea是谁,那赶紧补课,没有他的贡献,我们还只能用着Java最原始的装备处理多线程。
"I call it my billion-dollar mistake.",有资格说这话是空引用的发明者,Sir C. A. R. Hoare。你可以不知道Doug Lea,但你一定要知道这位老人家,否则,你便没资格使用快速排序。
在Java世界里,解决空引用问题常见的一种办法是,使用Null Object模式。这样的话,在“没有什么”的情况下,就返回Null Object,客户端代码就不用判断是否为空了。但是,这种做法也有一些问题。首先,我们肯定要为Null Object编写代码,而且,如果我们想大规模应用这个模式,我们要为几乎每个类编写Null Object。
幸好,我们还有另外一种选择:Optional。Optional是对可以为空的对象进行的封装,它实现起来并不复杂。在某些语言里,比如Scala,Optional实现成了语言的一部分。而对于Java程序员而言,Guava为我们提供了Optional的支持。闲言少叙,先来如何使用Optional,完成前面的那段代码。
Optional person = people.find("John Smith");
if (person.isPresent()) {
person.get().doSomething();
}
这里如果isPresent()返回false,说明这是个空对象,否则,我们就可以把其中的内容取出来做自己想做的操作了。
如果你期待的是代码量的减少,恐怕这里要让你失望了。单从代码量上来说,Optional甚至比原来的代码还多。但好处在于,你绝对不会忘记判空,因为这里我们得到的不是Person类的对象,而是Optional。
看完了客户端代码,我们再来看看怎样创建一个Optional对象,基本的规则很简单:
如果我们知道自己要封装的对象是一个空对象,可以用
Optional.absent();
如果封装的对象是一个非空对象,则可以用
Optional.of(obj);
如果不知道对象是否为空,就这样创建创建
Optional.fromNullable(obj);
有时候,当一个对象为null的时候,我们并不是简单的忽略,而是给出一个缺省值,比如找不到这个人,任务就交给经理来做。使用Optional可以很容易地做到这一点,以上面的代码为例:
Optional person = people.find("John Smith");
person.or(manager).doSomething()
说白了,Optinal是给了我们一个更有意义的“空”。
建议继续学习:
- Java技术路线 (阅读:6982)
- Java应用运维 (阅读:3825)
- Java陷阱(2010版) (阅读:3313)
- Java将Object对象转换为String的总结合集 (阅读:3022)
- Java 常量值修改后不起作用 (阅读:2869)
- Java的那些事儿 (阅读:2845)
- Eclipse Xtend对Java说:我帮你瘦身 (阅读:2698)
- Java泛型简明教程 (阅读:2717)
- 五四陈透过PHP看JAVA系列:strtotime (阅读:2342)
- 通过JNI实现Java对C/C++的调用 (阅读:2018)
扫一扫订阅我的微信号:IT技术博客大学习
- 作者:dreamhead 来源: 梦想风暴
- 标签: Java Optional
- 发布时间:2013-08-21 13:18:12
- [69] Twitter/微博客的学习摘要
- [68] IOS安全–浅谈关于IOS加固的几种方法
- [66] 如何拿下简短的域名
- [64] android 开发入门
- [63] find命令的一点注意事项
- [62] Go Reflect 性能
- [61] 流程管理与用户研究
- [60] Oracle MTS模式下 进程地址与会话信
- [59] 图书馆的世界纪录
- [57] 读书笔记-壹百度:百度十年千倍的29条法则