Optional的作用是什么?
主要作用是消除空指针,但是消除空指针并非是直接用上Optonal,而你什么也不用做了,还是需要做判断。
你可能会问,既然还是要做判断做处理,那跟我用if判断某个对象!=null有什么区别?
这是一个非常好的问题,我们往下看,就知道Optional消除空指针的目的了。
我们先来看不使用Optonal的例子,代码直接报空指针了NullPointerException,看代码:
@Data
public class OptPerson {
private String name;
private OptCar optCar;
}
@Data
public class OptCar {
private String carName;
private OptCarBrand optCarBrand;
}
@Data
public class OptCarBrand {
private String brandName;
}
/**
* Optional
* @author www.itzhimei.com
*/
public class OptTest {
public static void main(String[] args) {
OptPerson optPerson = new OptPerson();
optPerson.setName("IT之美");
System.out.println(optPerson);
System.out.println(optPerson.getOptCar().getOptCarBrand());
}
}
/*
OptPerson(name=IT之美, optCar=null)
Exception in thread "main" java.lang.NullPointerException
at com.itzhimei.base.lambda.option.OptTest.main(OptTest.java:14)
*/
我们在main函数里,当然可以使用if(optPerson.getOptCar() != null)来判断OptCar是否为空,然后再来进行后续操作,这样就能避免空指针,这是我们以往的操作方法。
我们再来看看使用了Optional包装上我们的目标类型的例子,看代码:
import java.util.Optional;
@Data
public class OptPerson {
private String name;
private Optional<OptCar> optCar;
}
@Data
public class OptCar {
private String carName;
private OptCarBrand optCarBrand;
}
@Data
public class OptCarBrand {
private String brandName;
}
import java.util.Optional;
/**
* Optional
* @author www.itzhimei.com
*/
public class OptTest {
public static void main(String[] args) {
OptPerson optPerson = new OptPerson();
optPerson.setName("IT之美");
optPerson.setOptCar(Optional.empty());
System.out.println(optPerson);
System.out.println(optPerson.getOptCar().get().getOptCarBrand());
}
}
/*
OptPerson(name=IT之美, optCar=Optional.empty)
Exception in thread "main" java.util.NoSuchElementException: No value present
at java.util.Optional.get(Optional.java:135)
at com.itzhimei.base.lambda.option.OptTest.main(OptTest.java:17)
*/
我们看到使用Optional包装的属性,如果是空的,直接调用还是会报错,虽然不是空指针,但其实也没什么区别,那么Optional的作用是什么呢?
从上一篇文章已经了解了Optional提供了几种方法来避免空指针,从而化解空对象报错的问题,但是Optional最核心的目的并不是消除空指针,而是在业务代码上区分一个Bean中的属性,哪些是可以为空的,哪些是不能为空的。
也就是说Optional的一个作用就是能够帮我们区分出,哪些属性是可以为空的,哪些是必须有值的。
例如上面的例子,声明了Optoinal包装类型的属性,说明是可以为空的,例如人的汽车,一个人可能有车,也可能没有,人名是必须有的,所以name属性声明为String类型,而不是Optoinal的包装类,而人的car属性,声明为Optional类型。