为什么使用 Optional.of 而不是 Optional.of 可空?
Why use Optional.of over Optional.ofNullable?
当使用 Java 8 Optional
class 时,有两种方法可以将值包装在可选值中。
String foobar = <value or null>;
Optional.of(foobar); // May throw NullPointerException
Optional.ofNullable(foobar); // Safe from NullPointerException
我知道 Optional.ofNullable
是使用 Optional
的唯一安全方法,但为什么 Optional.of
存在呢?为什么不直接使用 Optional.ofNullable
并始终保持安全?
你的问题是基于这样的假设,即可能抛出 NullPointerException
的代码比不会抛出的代码更糟糕。这个假设是错误的。如果您希望您的 foobar
由于程序逻辑而永远不会为 null,那么使用 Optional.of(foobar)
会好得多,因为您会看到 NullPointerException
,这表明您的程序有错误。如果你使用了Optional.ofNullable(foobar)
,而foobar
恰好是null
,那么你的程序会默默地继续错误地工作,这可能是一个更大的灾难。这样一来,错误可能会发生得更晚,也更难理解是哪一点出错了。
此外,如果您知道如果对象为空,您的代码将无法运行,您可以使用 Optional.orElseThrow
抛出异常
String nullName = null;
String name = Optional.ofNullable(nullName)
.orElseThrow(NullPointerException::new);
// .orElseThrow(CustomException::new);
可选无论如何应该主要用于服务的结果。在服务中,您知道手头有什么,如果有结果,则 return Optional.of(someValue) ;如果没有,则 return Optional.empty() 。在这种情况下,someValue 永远不应该为 null,你仍然 return 一个 Optional.
这取决于场景。
假设您有一些业务功能,您需要进一步处理具有该值的东西,但在处理时具有 null
值会影响它。
那么,在那种情况下,你可以使用Optional<?>
。
String nullName = null;
String name = Optional.ofNullable(nullName)
.map(<doSomething>)
.orElse("Default value in case of null");
当使用 Java 8 Optional
class 时,有两种方法可以将值包装在可选值中。
String foobar = <value or null>;
Optional.of(foobar); // May throw NullPointerException
Optional.ofNullable(foobar); // Safe from NullPointerException
我知道 Optional.ofNullable
是使用 Optional
的唯一安全方法,但为什么 Optional.of
存在呢?为什么不直接使用 Optional.ofNullable
并始终保持安全?
你的问题是基于这样的假设,即可能抛出 NullPointerException
的代码比不会抛出的代码更糟糕。这个假设是错误的。如果您希望您的 foobar
由于程序逻辑而永远不会为 null,那么使用 Optional.of(foobar)
会好得多,因为您会看到 NullPointerException
,这表明您的程序有错误。如果你使用了Optional.ofNullable(foobar)
,而foobar
恰好是null
,那么你的程序会默默地继续错误地工作,这可能是一个更大的灾难。这样一来,错误可能会发生得更晚,也更难理解是哪一点出错了。
此外,如果您知道如果对象为空,您的代码将无法运行,您可以使用 Optional.orElseThrow
String nullName = null;
String name = Optional.ofNullable(nullName)
.orElseThrow(NullPointerException::new);
// .orElseThrow(CustomException::new);
可选无论如何应该主要用于服务的结果。在服务中,您知道手头有什么,如果有结果,则 return Optional.of(someValue) ;如果没有,则 return Optional.empty() 。在这种情况下,someValue 永远不应该为 null,你仍然 return 一个 Optional.
这取决于场景。
假设您有一些业务功能,您需要进一步处理具有该值的东西,但在处理时具有 null
值会影响它。
那么,在那种情况下,你可以使用Optional<?>
。
String nullName = null;
String name = Optional.ofNullable(nullName)
.map(<doSomething>)
.orElse("Default value in case of null");