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

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

一个getter方法返回Optional<Foo>类型来代替经典的Foo是一种好的做法吗? 假定该值可以为null


当然,人们会做他们想做的事。 但是,我们在添加此功能时的确有明确的意图,并且它不是一个普通用途的可能或某种类型,尽可能多的人会喜欢我们这样做。 我们的目的是为库方法返回类型提供一个有限的机制,其中需要有一种清晰的方式来表示“无结果”,并且使用null可能会导致错误。

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

我认为经常使用它作为获取者的返回值肯定会被过度使用。

Optional没有任何问题,应该避免,这不是很多人希望的,因此我们非常担心热心过度使用的风险。

(公共服务通告:不调用Optional.get除非你能证明它永远不会为空,而是使用的安全方法,如一个orElseifPresent 。现在回想起来,我们应该叫getgetOrElseThrowNoSuchElementException或东西,使得它更加清晰(更新:Java 10有Optional.orElseThrow() ,它在语义上等同于get() ,但名称更合适。这是一种非常危险的方法,首先破坏了Optional的全部目的。 ))


在对我自己进行了一些研究之后,我遇到了很多可能在适当的时候提出的建议。 最具权威性的是来自Oracle文章的以下引用:

“需要注意的是,Optional类的目的不是要替换每一个空引用 ,而是为了帮助设计更易理解的API,以便通过阅读方法的签名,可以告诉你是否可以期望一个可选值,这迫使你主动打开一个可选项来处理缺少值的情况。“ 厌倦了空指针异常? 考虑使用Java SE 8的可选!

我还从Java 8中找到了这段摘录可选:如何使用它

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

  • 在域模型层(不可序列化)
  • 在DTOs(同样的原因)
  • 在方法的输入参数中
  • 在构造函数参数中“
  • 这似乎也提出了一些有效的观点。

    我无法找到任何负面含义或红旗建议Optional应尽量避免。 我认为总的想法是,如果它有助于或提高API的可用性,请使用它。


    我会说一般来说它是一个好主意,使用可选类型的返回值可以为空。 但是,对于框架,我认为用可选类型替换传统getter会在使用依赖于getter和setter编码约定的框架(如Hibernate)时造成很多麻烦。

    链接地址: http://www.djcxy.com/p/50211.html

    上一篇: Should Java 8 getters return optional type?

    下一篇: How to create custom javadoc tags?