本文正在参加「Java主题月 – Java Debug笔记活动」,详情查看<活动链接>
提问:如何使用Optional类?
使用Java8已经6个多月了,我对新的API变化非常满意。但我仍然不确定的一个方面是何时使用Optional
类。我想在任何地方都使用它,但我不确定这种方式是不是好的?
似乎有很多情况下我可以使用它,我从来没有确定它是否增加了好处(可读性/空安全性)或只是导致额外的开销。
所以,我举了几个例子,我很感兴趣你们是否认认为Optional
对于代码是有益的?
- 当返回值可能为
null
时
public Optional<Foo> findFoo(String id);
复制代码
- 当参数为
null
时
public Foo doSomething(String id, Optional<Bar> barOptional);
复制代码
- 作为某个bean的成员
public class Book {
private List<Pages> pages;
private Optional<Index> index;
}
复制代码
- 放在集合中
List<Optional<Foo>>
复制代码
但是Optonal在集合中有什么好的用途吗?
热门回答
Optional
的主要设计目标是为返回值的函数提供一种表示没有返回值的方法。这允许调用方继续一系列fluent方法调用。
这与OP问题中的用例1最为接近。尽管如此,缺少值比null
更精确,因为类似IntStream.findFirst
的东西永远不会返回null
。
对于用例2,将Optional
传递给一个方法,这是可行的,但是相当笨拙。假设你有一个方法,该方法接受一个字符串,后面跟一个Optional
类型的第二个字符串。接受Optional
作为第二个参数将导致如下情况:
foo("bar", Optional.of("baz"));
foo("bar", Optional.empty());
复制代码
甚至接受一个null
要更加好一些
foo("bar", "baz");
foo("bar", null);
复制代码
最好的办法使用重载,该方法接受单个字符串参数,并为第二个参数提供默认值:
foo("bar", "baz");
foo("bar");
复制代码
这确实有局限性,但它比上述任何一种都好。
用例#3和#4,在类字段或集合中使用Optional
,被认为是对API的滥用。首先,它违背了Optional
主要设计目标,如顶部所述。第二,它没有增加任何价值。
我相信有些人可能会想出一些人为的例子,他们真的想在字段或集合中存储Optional
,但一般来说,最好避免这样做。
文章翻译自Stack Overflow:stackoverflow.com/questions/2…