写作背景
- 在看到Optional这一新特性时,我就迫不及待的通过搜索引擎学习了一波。但是各种教程所提供的示例,让我完全感觉不到Optional的方便之处,甚至让我产生了一种错觉,觉得这个新特性是累赘的,完全不必要的。
- 在深入源码以及经过一段时间的摸索和使用后,也算是对Optional有了比较浅显的理解。Optional作为npe的解决方案,其实效果还是特别明显的,能很大程度上减少npe异常发生的频率,可以让源码更易于阅读。借着闲时,把自己用到的Optional方法总结下来,以供后续查阅。
无效示例1
你是否看过这样的示例?
public void test(String userName) {
Optional<String> options = Optional.ofNullable(userName);
if (options.isPresent()) {
String s = options.get();
// do something
}
}
如果单单只是判断是否为null,那么直接用==更方便,大可不必使用Optional,这既没有展示Optional的特性,也体现不了Optional的优势。
无效示例2
又或者这样的示例:
public void test(String userName) {
Optional<String> optional = Optional.of(userName);
optional.ifPresent(System.out::println);
}
一些文章为了将每一个Optional的每一个方法解释清楚,便将每个方法都单独写了一个示例。然而实际的使用是需要将Optional的多个方法联系起来才能最大发挥它的作用,单个示例就导致它们的剥离感严重,根本无法与实际业务结合起来使用,导致参考意义下降。
因此本文将不会对Optional的各个方法进行详细的阐述,只会说明Optional在实际场景中如何使用,并提及一些Optional方法的注意事项。
运用场景
Optional的作用:
- 开头提到了,Optional作为npe(NullPointerException)的解决方案,它的最主要作用就是保证操作一个null对象时,流程依旧会流转下去,不会不经开发者同意就向上抛出npe(是否抛取决于开发者的业务)。可以把这种功能简单的理解为Optional的每一步操作都会进行一个非空校验,空和非空会各自执行一个分支语句。
注意事项:
- 如果已知对象不可能为空,则尽量不要使用这个类来增加代码的复杂度。
- 如果条件判断比较简单,一般也不会用到Optional。
- 鉴于大多数情况下,开发者都不会主动去校验对象是否为null,从而导致程序中断,所以一般推荐将Optional用于查询结果的非空校验。
示例类关系示例
Product:
public class Product {
private Long id;
/**
* 商品详情
*/
private ProductDetail productDetail;
private Long categoryId;
/**
* 分类信息
*/
private Category category;
private Long brandId;
/**
* 品牌
*/
private Brand brand

420




被折叠的 条评论
为什么被折叠?



