使用Java 8 Optional类时,有两种方法可以将值包装在可选项中.
String foobar = <value or null>;
Optional.of(foobar); // May throw NullPointerException
Optional.ofNullable(foobar); // Safe from NullPointerException
Run Code Online (Sandbox Code Playgroud)
我理解Optional.ofNullable是唯一安全的使用方式Optional,但为什么Optional.of存在呢?为什么不Optional.ofNullable 随时使用并保持安全?
我在这里读到了为什么Optional.of()要使用它Optional.ofNullable(),但答案根本不能满足我,所以我要求略有不同:
如果您确定您的方法没有返回null,为什么要使用它Optional?据我所知,它或多或少的唯一目的是提醒"方法的用户",他可能不得不处理 - 值null.如果他不必处理价值,null他为什么要被一个人打扰Optional呢?
我问,因为我最近使我的服务层返回Optionals而不是nulls(在某些情况下).当我Optional.of()抛出NullPointer时,我使用并且非常困惑.
我做的一个样本:
Optional valueFromDB = getUserById("12");
User user = valueFromDB.get();
.....
public Optional<User> getUserById(String id) {
//...
return Optional.of(userRepository.findOne(id)); // NullPointerException!
}
Run Code Online (Sandbox Code Playgroud)
如果无法使用null,我不明白为什么会把它包装成一个Optional.链接答案中的家伙说:"好吧,如果NullPointer发生,它会马上发生!" 但我真的想要吗?如果一个人的唯一目的Optional是提醒那些得到这样一个对象的程序员,请null记住(他有必要打开它),为什么我想要NullPointerException在包装时?
编辑:我需要编辑问题,因为它被标记为重复,即使我已经从一开始就链接了所述问题.我也解释过,为什么答案不能让我满意,但现在我需要用一个解释来编辑我的文字.但是这里有一些我想问的附录,因为我得到了5个答案,每个人都回答了不同的案例,但没有一个完全覆盖我在这里要求的内容:
有没有理由,Optional.of(null)是不可能的,他们专门为null case添加了Optional.ofNullable()?
使用流不应该是我对实现的想法的问题.我从你的答案中得到了很多见解,谢谢你.但到目前为止,真正的问题还没有得到解答,据我所知/读/理解.也许我应该问:"如果我们删除该Optional.of()方法并且仅允许Optional.ofNullable()在Java 9中,除了向后兼容性之外会有什么问题吗?"