【发布时间】:2016-12-16 09:49:50
【问题描述】:
我已经读过here为什么要使用Optional.of()而不是Optional.ofNullable(),但答案根本不让我满意,所以我问的略有不同:
如果您确定您的方法不会返回null,那么为什么要使用Optional?据我所知,它或多或少的唯一目的是提醒“方法的用户”,他可能不得不处理null-values。如果他不必处理null-values,他为什么要打扰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!
}
如果 null 是不可能的,我不明白为什么要把它包装在 Optional 中。链接答案中的家伙说:“好吧,如果发生 NullPointer,它会立即发生!”但我真的想要吗?如果Optional 的唯一目的是提醒获得这样一个对象的程序员,记住null(他必须打开它),我为什么要在包装时拥有NullPointerException?
编辑:我需要编辑问题,因为它被标记为重复,即使我已经从一开始就链接了所述问题。我也解释了为什么答案不让我满意,但现在我需要用解释来编辑我的文本。 但这里是我想问的一些附录,因为我得到了 5 个答案,每个人都回答了不同的情况,但没有一个完全涵盖我在这里试图问的问题:
是否有原因, Optional.of(null) 是不可能的,他们专门为 null 情况添加了 Optional.ofNullable() ?
使用流不应该是我的实现想法的问题。
从你的回答中我得到了很多见解,谢谢。但就我所知/阅读/理解而言,真正的问题直到现在还没有得到回答。
也许我应该问:“如果我们删除 Optional.of() 方法并在 Java 9 中只允许 Optional.ofNullable() 怎么办,除了向后兼容会不会有任何问题?”
【问题讨论】:
-
Optional的唯一目的是明确指出可能没有结果。如果使用得当,您不需要进行null检查,您可以进行user.ifPresent(doAMethod())或可以在流和其他JDK8 API 中使用它而无需检查null元素。因此,如果使用得当,它可以减少代码中的空值检查量。 -
@M.Deinum:
ifPresent基本上是一个空检查。 :P 它看起来更好,使用更方便。虽然我得到了流的东西,但这与问题本身无关。我没有质疑 Optionals,我确实质疑Optional.of()是否有用。抱歉,如果不清楚。 -
如果您的方法不打算返回 null,一方面我同意您不想返回
Optional。另一方面,如果有一天您要返回的值错误地为空,您确实希望得到通知。我会使用一个很好的旧assert声明。
标签: java nullpointerexception java-8 optional