目录
●再说Optional类
上一篇文章概述性地介绍了一下Optional类,可能许多读者还是无法很好的掌握。笔者一开始接触这个类的时候也没有发现其有什么特别的好处,特别是对于“可以有效地避免空指针异常”这个特点理解得不够深刻,为什么这么说呢?结合一段代码,说说笔者当初的疑惑,以及是如何一步一步解决这个疑惑的:
//原始业务代码
User user = userService.getUserbyId(0);
user.setUserName("小明");
//初次使用Optionnal
User user = userService.getUserbyId(0);
Optional<User> op = Optional.of(user);
if(op.isPresent()){
op.get().setUserName("小明");
}
逻辑很简单,设置id为0的用户姓名为“小明”。原始业务代码中,确实可能出现空指针异常,因为数据库中可能不存在id为0的用户。因此,应该做一个非空判断。
初次尝试使用Optional类,发现居然也出现了一个空指针异常,在Optional<User> op = Optional.of(user);这一行,觉得很奇怪,不是说Optional类可以装一个null对象吗?不是说Optional类可以有效地避免空指针异常吗?怎么还会这样呢?后来又仔细查了一下,发现原来学到的只是皮毛,如果用工厂方法Optional.of()构造一个Optional类,必须保证参数是一个非空对象。但这个时候依然有疑惑,不是说Optional可以包装一个null的对象吗,为什么还会报空指针异常呢?
顺藤摸瓜,我们来看看Optional.of()方法的源码:
/**
* Returns an {@code Optional} with the specified present non-null value.
*
* @param <T> the class of the value
* @param value the value to be present, which must be non-null
* @return an {@code Optional} with the value present
* @throws NullPointerException if value is null
*/
public static <T> Optional<T> of(T value) {
return new Optional<>(value);
}
/**
* Constructs an instance with the value present.
*
* @param value the non-null value to be present
* @throws NullPointerException if value is null
*/
private Optional(T value) {
this.value = Objects.requireNonNull(value);
}
/**
* Checks that the specified object reference is not {@code null}. This
* method is designed primarily for doing parameter validation in methods
* and constructor