为什么使用 Optional.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.ofNullableOptionalOptional.ofOptional.ofNullable


答案 1

您的问题基于假设,即可能引发的代码比可能不抛出的代码更差。这种假设是错误的。如果你希望由于程序逻辑而永远不会为空,那么最好使用它,因为你会看到一个,这将表明你的程序有一个错误。如果您使用并且碰巧是由于该错误,那么您的程序将默默地继续错误地工作,这可能是一个更大的灾难。这样,错误可能会在很久以后发生,并且更难理解它在哪个点上出错了。NullPointerExceptionfoobarOptional.of(foobar)NullPointerExceptionOptional.ofNullable(foobar)foobarnull


答案 2

此外,如果您知道如果对象为 null,则代码不应工作,则可以使用 Optional.orElseThrow 引发异常

String nullName = null;

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