为什么在Optional.ofNullable上使用Optional.of?

时间:2015-07-29 09:30:58

标签: java java-8 nullpointerexception null optional

使用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并始终保持安全?

5 个答案:

答案 0 :(得分:245)

您的问题是基于可能抛出NullPointerException的代码比不可能抛出的代码更糟糕的假设。这个假设是错误的。如果您希望foobar由于程序逻辑而永远不会为空,那么使用Optional.of(foobar)要好得多,因为您会看到NullPointerException,表示您的程序已包含Optional.ofNullable(foobar)一个bug。如果您使用foobar并且null恰好是<html> <head> <script> function setup() { document.getElementById('buttonid').addEventListener('click', openDialog); function openDialog() { document.getElementById('fileid').click(); } document.getElementById('fileid').addEventListener('change', submitForm); function submitForm() { document.getElementById('formid').submit(); } } </script> </head> <body onload="setup()"> <form id='formid' action="mb.php" method="POST" enctype="multipart/form-data"> <input id='fileid' type='file' name='filename' hidden/> <input id='buttonid' type='button' value='Upload MB' /> <input type='submit' value='Submit' hidden="" /> </form> </body> </html> ,那么您的程序将默默地继续正常工作,这可能是一场更大的灾难。这样一来,错误可能会在很晚之后发生,而且在理解它出错的时候会更难理解。

答案 1 :(得分:6)

此外,如果您知道对象为null时代码不起作用,则可以使用 Optional.orElseThrow

引发异常
String nullName = null;
String name = Optional.ofNullable(nullName).orElseThrow(NullPointerException::new);

@ tagir-valeev,如果我错了,请更正。

答案 2 :(得分:1)

这完全取决于场景, 可选类具有私有构造函数,因此我们无法使用new关键字创建对象。 根据要求,我们可以使用该方法的任何一种

  • empty():对于没有值的对象,使用null插入,我们可以使用Optional.empty()
  • of(T值):创建一些可选值:在这种方法中, 不允许使用空值
  • ofNullable(T值):创建一些可选值,如果 value可以为空

总之,我们可以说,如果您确定该值不为null,则可以使用 of();如果您认为该值可以为null,则必须使用 ofNullable()

有关更多详细信息,请参阅how to create option object in java 8

答案 3 :(得分:0)

无论如何,主要应该将可选用于服务结果。在服务中,您知道手头有什么,如果有结果,则返回Optional.of(someValue),否则,则返回Optional.empty()。在这种情况下,某些值永远不应为null,而且您仍返回Optional。

答案 4 :(得分:0)

这取决于场景。

假设您具有一些业务功能,您需要进一步处理具有该值的内容,但是在处理时具有null值会对其产生影响。

然后,在这种情况下,您可以使用Optional<?>

String nullName = null;

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