zoukankan      html  css  js  c++  java
  • Guava API学习之Optional 判断对象是否为null

    java.lang.NullPointerException,只要敢自称Java程序员,那对这个异常就再熟悉不过了。为了防止抛出这个异常,我们经常会写出这样的代码:

        Person person = people.find("John Smith");  
        if (person != null) {  
         person.doSomething();  
        }  

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

    简单使用实例:

        Student student = new Student();  
                String name = student.getName();  
                Optional<String> optional = Optional.fromNullable(name);  
                if (optional.isPresent()) {  
                    System.out.println("name : " + name);  
                }else {  
                    System.out.println("null ........");  
                    student.setName("sungang");  
                }  
                  
                name = student.getName();  
                optional = Optional.fromNullable(name);  
                if (optional.isPresent()) {  
                    System.out.println("name : " + name);  
                }else {  
                    System.out.println("null ........");  
                    student.setName("sungang");  
        }  

    结果:

        null ........  
        name : sungang  
  • 相关阅读:
    线性变换
    施密特正交化
    春有它的记忆,秋有它的情怀
    最美的动作其实只需要嘴角上扬-微笑
    pomotime_v1.7.2 番茄软件完全教程
    NGUI 之 不为人知的 NGUITools
    Unity3D 开发 之 加载Android应用的环境
    Unity3D 开发 之 JDK安装与环境变量配置
    Tesseract 对验证码的识别原理和实现步骤
    sizeof_and_strlen 的区别
  • 原文地址:https://www.cnblogs.com/sungang/p/3641164.html
Copyright © 2011-2022 走看看