Optional
Java 8 中引入的类型对于许多开发人员来说是一个新事物。
getter 方法返回 Optional<Foo>
类型代替经典 Foo
是一个好习惯吗?假设该值可以是 null
。
原文由 leonprou 发布,翻译遵循 CC BY-SA 4.0 许可协议
Optional
Java 8 中引入的类型对于许多开发人员来说是一个新事物。
getter 方法返回 Optional<Foo>
类型代替经典 Foo
是一个好习惯吗?假设该值可以是 null
。
原文由 leonprou 发布,翻译遵循 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 许可协议
15 回答8.4k 阅读
8 回答6.2k 阅读
1 回答4k 阅读✓ 已解决
3 回答6k 阅读
3 回答2.2k 阅读✓ 已解决
2 回答3.1k 阅读
2 回答3.8k 阅读
当然,人们会为所欲为。但是我们在添加这个特性的时候确实有一个明确的意图,它 不是 一个通用的 Maybe 类型,尽管很多人希望我们这样做。我们的目的是为库方法返回类型提供一种有限的机制,其中需要一种明确的方式来表示“无结果”,并且使用
null
有可能导致错误。例如,你可能永远不应该将它用于返回结果数组或结果列表的东西;而是返回一个空数组或列表。您几乎不应该将它用作某物的字段或方法参数。
我认为经常将它用作 getter 的返回值肯定会过度使用。
应该避免使用 Optional 并没有什么 _错_,只是它不是许多人希望的那样,因此我们非常担心过度使用的风险。
(公共服务公告: 永远不要 调用
Optional.get
除非你能证明它永远不会为空;而是使用一种安全的方法,如orElse
或ifPresent
,我们应该调用get
类似getOrElseThrowNoSuchElementException
或更清楚地表明这是一种高度危险的方法,它破坏了Optional
中的整个目的第一名。经验教训。(更新:Java 10 有Optional.orElseThrow()
,在语义上等同于get()
,但其名称更合适。)