Java 8 getter 应该返回可选类型吗?

新手上路,请多包涵

Optional Java 8 中引入的类型对于许多开发人员来说是一个新事物。

getter 方法返回 Optional<Foo> 类型代替经典 Foo 是一个好习惯吗?假设该值可以是 null

原文由 leonprou 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 453
2 个回答

当然,人们会为所欲为。但是我们在添加这个特性的时候确实有一个明确的意图,它 不是 一个通用的 Maybe 类型,尽管很多人希望我们这样做。我们的目的是为库方法返回类型提供一种有限的机制,其中需要一种明确的方式来表示“无结果”,并且使用 null 有可能导致错误。

例如,你可能永远不应该将它用于返回结果数组或结果列表的东西;而是返回一个空数组或列表。您几乎不应该将它用作某物的字段或方法参数。

我认为经常将它用作 getter 的返回值肯定会过度使用。

应该避免使用 Optional 并没有什么 _错_,只是它不是许多人希望的那样,因此我们非常担心过度使用的风险。

(公共服务公告: 永远不要 调用 Optional.get 除非你能证明它永远不会为空;而是使用一种安全的方法,如 orElseifPresent ,我们应该调用 get 类似 getOrElseThrowNoSuchElementException 或更清楚地表明这是一种高度危险的方法,它破坏了 Optional 中的整个目的第一名。经验教训。(更新:Java 10 有 Optional.orElseThrow() ,在语义上等同于 get() ,但其名称更合适。)

原文由 Brian Goetz 发布,翻译遵循 CC BY-SA 4.0 许可协议

在我自己做了一些研究之后,我发现了一些可能会在适当的时候提出建议的事情。最权威的是 Oracle 文章中的以下引用:

“重要的是要注意 Optional 类的目的 不是替换每个空引用。相反,它的目的是帮助设计 更易于理解的 API ,以便仅通过阅读方法的签名,您就可以判断您是否可以期望一个可选值。这会迫使您主动打开一个 Optional 来处理缺少值的情况。” - 厌倦了空指针异常?考虑使用 Java SE 8 的可选!

我还从 Java 8 Optional: How to use it 中 找到了这段摘录

“Optional 并不意味着在这些情况下使用,因为它不会给我们买任何东西:

  • 在域模型层(不可序列化)
  • 在 DTO 中(同样的原因)
  • 在方法的输入参数中
  • 在构造函数参数中”

这似乎也提出了一些有效的观点。

我找不到任何负面含义或危险信号来表明应避免使用 Optional 。我认为一般的想法是,如果它有帮助或提高了 API 的可用性,就使用它。

原文由 Justin 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题