使用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
并始终保持安全?
答案 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关键字创建对象。 根据要求,我们可以使用该方法的任何一种
总之,我们可以说,如果您确定该值不为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");