美文网首页
java8-Optional的引入

java8-Optional的引入

作者: 李福春carter | 来源:发表于2019-11-17 23:00 被阅读0次

背景

NPE问题,100%的Java程序员都碰到,并且曾经是心中的痛。
1965年英国TonyHoare引入了Null引用,后续的设计语言包括Java都保持了这种设计。

一个例子

业务模型

Person 有车一族, 有Car字段,

Car 车,每个车都有购买保险, 有Insurance字段;

Insurance 保险,每个保险都有名字 有name字段;

需求:获取某个Person对象的购买保险的名称;


常规编程

    public String getCarInsuranceName(Person person) {
        return person.getCar().getInsurance().getName();
    }

检查式编程

 public String getCarInsuranceName_check(Person person) {
        if (Objects.nonNull(person)) {
            final Car car = person.getCar();
            if (Objects.nonNull(car)) {
                final Insurance insurance = car.getInsurance();
                if (Objects.nonNull(insurance)) {
                    return insurance.getName();
                }
            }
        }
        return "unkown";
    }

防御式编程

public String getCarInsuranceName_protect(Person person) {
        if (Objects.isNull(person)) {
            return "unkown";
        }
        final Car car = person.getCar();
        if (Objects.isNull(car)) {
            return "unkown";
        }
        final Insurance insurance = car.getInsurance();
        if (Objects.isNull(insurance)) {
            return "unkown";
        }
        return insurance.getName();
    }

对比一下缺点:

编程方法 缺点
常规编程 NPE问题
检查式编程 1.可读性不好,多层if嵌套; 2.扩展性不好,需要熟悉全流程,否则不知道应该在哪个if中扩展,极易出错;
防御式编程 1. 维护困难,4个不同的退出点,极易出错,容易遗漏检查项目

NPE的痛点

  1. java程序中出现最多的Exception;没有之一;
  2. 使得代码量膨胀混乱,对象的空判断充斥在代码中,但是却没有实际的业务意义;
  3. 类型系统的一个后门,实际上不属于任何类型,也可以说是任何类型;
  4. 本身无意义,标识对缺失值的建模,也破坏了java中弱化指针的理念。

java8中对缺失值的建模对象是Optional,可以基于它解决NPE的痛点,设计更好的API

Optional

领域模型的建模进化

  1. Person , 含有一个Optional<Car> car字段,一个人可能有车,也可能没有车;
  2. Car, 包含有一个Optional<Insurance> insurance字段, 一台车可能买了保险,也可能没有买保险;
  3. Insurance , 保险公司必定有名字所有,他有一个字段 name;

构造方法

构造方法 说明 备注
Optional.empty() 一定是空的对象 跟null有区别,是一个单例对象
Optional.of(T t) 一定是不空的对象 如果给了null值会立刻抛出NPE
Optioanl.ofNullable(T t) 允许为空的对象放在里面 使用值之前需要做检查

map方法-对象中提取和转换值

原创不易,转载请注明出处。

相关文章

  • java8-Optional的引入

    背景 NPE问题,100%的Java程序员都碰到,并且曾经是心中的痛。1965年英国TonyHoare引入了Nul...

  • java8-Optional的引入

    背景 NPE问题,100%的Java程序员都碰到,并且曾经是心中的痛。1965年英国TonyHoare引入了Nul...

  • Java8-Optional

    Java8引入了全新的Optional类,主要用来处理空指针异常(NullPointerException)。从本...

  • Java8-Optional

    Optional java8添加的容器对象,在一些场景下避免使用null检查而设定的类,尽可能避免的NullPoi...

  • java8-Optional类

    背景 NPE问题,100%的Java程序员都碰到,并且曾经是心中的痛。1965年英国TonyHoare引入了Nul...

  • java8-Optional的实战应用

    Optional的学习与实战 整片文章大部分内容来自java8实战这本书,我在这里也是将自己的学习过程记录下来,并...

  • Java8-Optional使用Demo

    ​ ​

  • 引入

    古来圣贤皆寂寞, 月色幽幽酌酒欢; 酣饮兴起华章出, 无人知是山外音。

  • 引入

    我说我毕生的理想便是见到你给个拥抱,坐下来我们聊聊,平等的姿态,而不是个狂热的粉丝说句:“赵雷,我喜欢你”之后再也...

  • 引入

    与其羡慕他人的聪慧,不如自己勤奋补拙;与其羡慕他人的优秀,不如自己奋斗不止;与其羡慕他人的坚强,不如自己百炼成钢;...

网友评论

      本文标题:java8-Optional的引入

      本文链接:https://www.haomeiwen.com/subject/gjimictx.html