这个问题已经超过七年了,但我对最佳答案感到非常沮丧,因此我不得不写出我的答案。
现有回答(包括最佳回答)未能正确回答该问题的原因在于,最初的问题本身就是不合适的。如果您没有提出正确的问题,那么您将无法得到正确的答案。
原始问题的不当之处在于它比较了错误的一对。 java.util.Optional
中有三个静态方法。
Optional#empty()
Optional#of(T value)
Optional#ofNullable(T value)
这对的不是of
和ofNullable
,而是of
和empty
。 这是因为这两个是创建新实例的工厂方法,其中Optional
不提供公共构造函数。
当您想创建Optional
的新实例时,可以从of
和empty
中选择。
Optional<Integer> answer = Optional.of(42);
在这种用法中,您确定不会将
null
传递给
of()
,因为是您初始化实例。如果您想创建一个空实例,只需选择
empty()
即可。因此,如果您在此阶段向
of()
传递
null
值,显然是一个错误,您应该收到NPE。
在这个问题的评论者之一建议说,由于
ofNullable
比
of
更有用,如果
ofNullable
被命名为
of
,而
of
则是
ofNotNull
,那么就会更好。这个观点很好。但是,当您考虑到
of
和
empty
是官方的
Optional
工厂方法时,使用更常见的定义具有较短的名称是有意义的。此外,它还是一个良好的名称,与其他Java集合类工厂方法的命名方式相一致,例如
List#of()
、
Set#of()
和
Map#of()
。
那么什么是
ofNullable
?这实际上是一个实用的适配器方法,用于将消除了空值的
Optional
世界与充满
null
的传统世界桥接起来。它用于将在其他地方定义的变量或从外部服务接收到的返回值包装在
Optional
中,使它们具有空值安全性。
String foo = someExternalAPI();
Optional<String> bar = Optional.ofNullable(foo);
由于这是一个实用方法而不是主要工厂方法,因此给它一个稍微长一点的名称通常是可以接受的,甚至是一个好的做法,一个实用方法应该有一个描述性的名称,清楚地表明其意图。
摘要
Optional#of(T value)
的配对对象是 Optional#empty()
。
- 使用
of
或 empty
创建新的 Optional
实例。
- 使用
ofNullable
将现有变量包装为 Optional
。
java.util.Optional
。 - whirlwinofNullable()
的名称更改为of()
,并将of()
的名称更改为ofNotNull()
。请看下面的翻译:我希望他们能够将ofNullable()
这个名字改为of()
,并且把of()
这个名字改为ofNotNull()
。 - Robert Niestroj