在类中使用Optional作为属性是一个好习惯吗?

bas*_*aad 26 java optional java-8

我已经阅读了OptionalJava 8中的目的(遗憾的是我不记得在哪里),我很惊讶作者没有提到在类中使用an Optional作为属性.

由于我在课堂上经常使用选项,我想知道这是不是很好.或者我可以更好地使用普通属性,null它们在未设置时返回?

注意:看起来我的问题可能是基于意见的,但我觉得Optional在课堂上使用的感觉真的不是要走的路(看完上面提到的帖子后).但是,我喜欢使用它,并且找不到使用它的任何缺点.

我想举一个例子来澄清.我有一个类Transaction,它是这样构建的:

public class Transaction {

     private Optional<Customer> = Optional.empty();
     ....
Run Code Online (Sandbox Code Playgroud)

VS

public class Transaction {

     private Customer = null;
     ....
Run Code Online (Sandbox Code Playgroud)

当在一个检查Customer,我认为这是最合理的使用transaction.getCustomer().isPresent()transaction.getCustomer() != null.在我看来,第一个代码比第二个代码更清晰.

Jes*_*per 37

Java 8 Optional主要用于方法的返回值,而不是Java类的属性,如Java SE 8中的Optional中所述:

当然,人们会做他们想做的事.但是在添加此功能时我们确实有明确的意图,并且它不是一般目的MaybeSome类型,就像许多人希望我们这样做一样.我们的目的是为库方法返回类型提供一种有限的机制,其中需要一种明确的方式来表示"无结果",并且使用null这种方法绝对可能导致错误.

这里的关键是重点用作返回类型.该类绝对不打算用作Java Bean的属性.对此的见证是Optional没有实现Serializable,这通常是广泛用作对象属性所必需的.

  • 关于您所链接的博客的有趣之处在于您引用的部分是[StackOverflow答案]的引用(http://stackoverflow.com/a/26328555/2711488) (10认同)
  • 来自 scala 我真的不明白为什么不能使用完美解决问题的东西,因为发明者指定了它的主要用法不同。我目前通过阅读具有可为 null 属性的 TDO 的 Java 代码而偶然发现了这个“问题”,并且这些属性的每次使用都包装在可选中,而不是直接将属性定义为可选。所以我只看到缺点而不是任何好处 (7认同)
  • 最好是“通用”。他们是说,他们引入了一种解决方法,可以使用一个完全通用的概念来代替? (4认同)
  • 强烈反对,不管他们的意图是什么,Java 可选对于这个目的来说是非常棒的。唯一的缺点是序列化,可以使用大多数现代序列化库(例如 Jackson 的 Jdk8Module)轻松解决。以这种方式使用可选会产生更干净的客户端代码(Optional.map/orElse/ifPresent),并且不可能意外忘记某些可为空的内容。空引用的创建者自己称其为数十亿美元的错误:https://www.infoq.com/presentations/Null-References-The-Billion-Dollar-Mistake-Tony-Hoare/ (3认同)
  • 事实上,jdk 的某些类**确实使用** `Optional` 作为字段(例如 ImmutableHttpRequest、HttpResponseImpl,...)。所以我想在某些用例中这样做是可以接受的,即使一般不建议这样做。 (3认同)
  • @Jesper 和 Java 最初并不是为了编写复杂的服务器应用程序堆栈,但我们在这里。*事物并不只是按照其创造者的意图行事。* (2认同)

Cra*_*ing 5

我认为这是一个理论问题。

可选值的概念来自函数式语言世界。这些语言通常还支持语言级别的模式匹配,并允许您对可选值进行模式匹配。

在函数式语言中,函数调用通常返回一个可选值,其他代码可以对其进行模式匹配。

我从未见过传递可选参数作为参数,但这并不意味着这是一个糟糕的想法。不过看起来很奇怪。