IT技术博客大学习 共学习 共进步

你应该更新的Java知识之Optional

梦想风暴 2013-08-21 13:18:12 浏览 2,983 次

   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是给了我们一个更有意义的“空”。

建议继续学习

  1. Java技术路线 (阅读 7,642)
  2. Java应用运维 (阅读 5,224)
  3. Java陷阱(2010版) (阅读 4,001)
  4. Java 常量值修改后不起作用 (阅读 3,902)
  5. Java的那些事儿 (阅读 3,762)
  6. Java将Object对象转换为String的总结合集 (阅读 3,703)
  7. Java泛型简明教程 (阅读 3,663)
  8. Eclipse Xtend对Java说:我帮你瘦身 (阅读 3,463)
  9. 五四陈透过PHP看JAVA系列:strtotime (阅读 3,243)
  10. 通过JNI实现Java对C/C++的调用 (阅读 3,042)