概述:Optional最早是Google公司Guava中的概念,代表的是可选值。Optional类从Java8版本开始加入豪华套餐,主要为了解决程序中的NPE问题,从而使得更少的显式判空,防止代码污染,另一方面,也使得领域模型中所隐藏的知识,得以显式体现在代码中。Optional类位于java.util包下,对链式编程风格有一定的支持。实际上,Optional更像是一个容器,其中存放的成员变量是一个T类型的value,可值可,使用的是Wrapper模式,对value操作进行了包装与设计。本文将从Optional所解决的问题开始,逐层解剖,由浅入深,文中会出现Optioanl方法之间的对比,实践,误用情况分析,优缺点等。与大家一起,对这项Java8中的新特性,进行理解和深入。
1、解决的问题
臭名昭著的空指针异常,是每个程序员都会遇到的一种常见异常,任何访问对象的方法与属性的调用,都可能会出现Pointexception,如果要确保不触发异常,我们通常需要进行对象的判空操作。举个栗子,有一个人(Shopper)进超市购物,可能会用购物车(Trolley)也可能会用其它方式,购物车里可能会有一袋栗子(Chestnut),也可能没有。三者定义的代码如下:
public class Shopper {
private Trolley trolley;
public Trolley getTrolley{
return trolley;
}
}
public class Trolley {
private chestnut chestnut;
public Chestnut getChestnut{
return chestnut;
}
}
public class Chestnut {
private String name;
public String getName{
return name;
}
}
这时想要获得购物车中栗子的名称,像下面这么写,就可能会见到我们的“老朋友”(NPE)
public String result(Shopper shopper){
return ;
}
为了能避免出现空指针异常,通常的写法会逐层判空(多层嵌套法),如下
public String result(Shopper shopper) {
if (shopper != ) {
Trolley trolley = ;
if (trolley != ) {
Chestnut chestnut = ;
if (chestnut != ) {
return c;
}
}
}
return "获取失败辽";
}
多层嵌套的方法在对象级联关系比较深的时候会看的眼花缭乱的,尤其是那一层一层的括号