为什么使用可选。of over Optional.ofNullable?

在使用Java 8 Optional类时,有两种方法可以将值包装在可选对象中。

String foobar = <value or null>;
Optional.of(foobar);         // May throw NullPointerException
Optional.ofNullable(foobar); // Safe from NullPointerException

我知道Optional.ofNullable是使用Optional的唯一安全方式,但为什么会存在Optional.of呢?为什么不直接使用Optional.ofNullable,在任何时候都是安全的呢?

190783 次浏览

你的问题是基于这样的假设:可能抛出NullPointerException的代码比不抛出NullPointerException的代码更糟糕。这种假设是错误的。如果由于程序逻辑,你希望你的foobar永远不会为空,最好使用Optional.of(foobar),因为你会看到一个NullPointerException,这将表明你的程序有一个错误。如果你使用了Optional.ofNullable(foobar),而由于这个错误,foobar恰好是null,那么你的程序将会默默地继续错误地工作,这可能是一个更大的灾难。通过这种方式,错误可能会在很久之后发生,并且很难理解错误发生在什么时候。

此外,如果你知道你的代码在object为空时不应该工作,你可以使用Optional.orElseThrow抛出异常

String nullName = null;


String name = Optional.ofNullable(nullName)
.orElseThrow(NullPointerException::new);
// .orElseThrow(CustomException::new);

不管怎样,Optional应该主要用于Services的结果。在服务中,你知道你手头有什么,如果你有一个结果,返回option .of(someValue),如果你没有,返回option .empty()。在这种情况下,someValue永远不应该为空,并且仍然返回一个Optional。

这取决于具体情况。

假设你有一些业务功能,你需要用该值进一步处理一些东西,但在处理时拥有null值会影响它。

在这种情况下,你可以使用Optional<?>

String nullName = null;


String name = Optional.ofNullable(nullName)
.map(<doSomething>)
.orElse("Default value in case of null");

主要差异b/w可选。的和可选的。ofNullable是如果包裹在Optional下的元素为null,则为Optional。的值将引发空指针异常,并停止对代码的进一步处理。然而,可选的。ofNullable将忽略null元素/对象,并返回Optional.empty()或NoSuchElementPresent。