Java 8获得者应该返回可选types吗?

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

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

当然,人们会做他们想做的事情。 但是,我们在添加这个function的时候确实有一个明确的意图,这不是一个普通的目的, 也不是一个types,尽可能多的人会喜欢我们这样做。 我们的目的是为库方法返回types提供一个有限的机制,在这个机制中需要有一个清晰的方法来表示“没有结果”,并且使用null是绝对有可能导致错误的。

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

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

可选scheme没有什么问题 ,应该避免,这不是很多人所希望的,因此我们非常担心热心的过度使用的风险。

(公共服务公告:除非你可以certificate它永远不会是null,否则不要使用 Optional.get ;而应该使用orElseifPresent类的安全方法。回想起来,我们应该调用getOrElseThrowNoSuchElementException东西,或者使得它更加清晰这是一个非常危险的方法,首先破坏了select的全部目的。

在做了一些我自己的研究之后,我遇到了很多可能在适当的时候提出的build议。 最权威的是从Oracle的一篇文章引用如下引文:

“重要的是要注意,Optional类的意图不是要replace每一个空引用 ,而是为了帮助devise更易理解的API,以便只读取一个方法的签名就可以告诉你可以期望一个可选的值,这迫使你主动打开一个可选的来处理缺失的值。 厌倦了空指针exception? 考虑使用Java SE 8的可选!

我也从Java 8中find这个摘录可选:如何使用它

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

  • 在领域模型层(不可序列化)
  • 在DTOs(同样的原因)
  • 在方法的input参数中
  • 在构造函数参数中“

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

我无法find任何负面的内涵或红色的标志,build议应该避免select。 我认为一般的想法是,如果它有帮助或提高您的API的可用性,使用它。

我会说一般来说它是一个好主意,使用可选types的返回值可以为空。 然而,对于框架,我认为用可选typesreplace古典getter会在使用依赖于getter和setter编码约定的框架(例如Hibernate)时造成很多麻烦。

如果您使用现代串行器和其他理解Optional框架,那么在编写Entity bean和域图层时,我发现这些准则工作得很好:

  1. 如果序列化层(通常为DB)允许表FOO BAR栏中的单元格为null值,则getter Foo.getBar()可以返回Optional指示开发人员可以合理预期该值为null,应该处理这个。 如果数据库保证该值不会为空,那么getter不应该包含在一个Optional
  2. Foo.bar应该是private不是 Optional 。 如果它是private那么它是没有理由的。
  3. 设置器Foo.setBar(String bar)应该采取的types的bar不是 Optional 。 如果可以使用null参数,则在JavaDoc注释中声明它。 如果不能使用null那么IllegalArgumentException或一些适当的业务逻辑,恕我直言,更合适。
  4. 构造函数不需要Optional参数(类似于第3点的原因)。 通常我只在构造函数中包含参数,在序列化数据库中必须是非空的。

为了使上述效率更高,您可能需要编辑您的IDE模板,以便为toString()equals(Obj o)等生成getter和相应的模板,或直接使用字段(大多数IDE生成器已经处理空值)。