将 Optional 用作类中的属性是一种好习惯吗? [复制]
Posted
技术标签:
【中文标题】将 Optional 用作类中的属性是一种好习惯吗? [复制]【英文标题】:Is it a good practice to use Optional as an attribute in a class? [duplicate] 【发布时间】:2015-05-16 00:15:50 【问题描述】:我读过一些关于 Java 8 中 Optional
用途的文章(不幸的是我不记得在哪里),我很惊讶作者没有提到使用 Optional
作为类中的属性.
由于我在课堂上经常使用可选项,我想知道这是否是一个好习惯。或者我最好只使用普通属性,当它们未设置时返回null
?
注意:看起来我的问题是基于意见的,但我觉得在课堂上使用Optional
真的不是要走的路(在阅读了提到的帖子之后)。但是,我喜欢使用它,并且找不到使用它的任何缺点。
示例
我想举个例子来澄清一下。我有一个类Transaction
,它是这样构建的:
public class Transaction
private Optional<Customer> = Optional.empty();
....
对比
public class Transaction
private Customer = null;
....
检查Customer
时,我认为使用transaction.getCustomer().isPresent()
比使用transaction.getCustomer() != null
更合乎逻辑。在我看来,第一个代码比第二个更干净。
【问题讨论】:
@AdamSiemion 我们在这里谈论的是 Guava 的Optional
还是 Java 8 的 Optional
?
@AdamSiemion 感谢您的链接!我没有那么有经验,所以不知道番石榴已经有了。但是,这里提到的主要原因是Optional
具有三种可能性:存在、不存在和空。 Java 8 已经不存在了,所以这个论点不再有效..
@bashoogzaad 无论是三个(null,absent,present)还是两个选项(null/empty,present)都不会改变Optional
的用途。
@Jesper 我认为Optional
的目的在 Guava 和 Java 8 中是相同的,不是吗?
@AdamSiemion Java 8 Optional
的设计者清楚地知道它的用途(见我的回答)。 Guava 的设计者可能有不同的想法。 Guava 的Optional
确实实现了Serializable
而Java 8 的Optional
没有,这表明Guava 的Optional
可能比Java 8 更适合字段。
【参考方案1】:
Java 8 的 Optional
主要用于方法的返回值,而不是用于 Java 类的属性,如 Optional in Java SE 8 中所述:
当然,人们会做他们想做的事。但我们在添加此功能时确实有明确的意图,它不是通用的
Maybe
或Some
类型,就像很多人希望我们这样做一样。 我们的目的是为库方法返回类型提供一种有限的机制,在这种情况下,需要一种明确的方式来表示“无结果”,而使用null
极有可能导致错误。这里的关键是专注于用作返回类型。 该类绝对不打算用作 Java Bean 的属性。 证明这一点的是
Optional
没有实现Serializable
,这对于广泛用作对象。
【讨论】:
感谢您的回答!了解创作者对Optional
的意图非常有帮助。关于Serializable
实现的争论我并不完全清楚,但这是我的错,因为我不使用它。
您所链接的博客的有趣之处在于,您引用的部分是 a *** answer
最好是“通用”。他们是说,他们引入了一种解决方法,可以使用完全通用的概念来代替?
来自 scala 我真的不明白为什么不能使用完美解决问题的东西,因为发明者指定它的主要用途不同。我目前通过阅读具有可空属性的 TDO 的 Java 代码偶然发现了这个“问题”,并且这些属性的每次使用都包装在 Optional 中,而不是直接将属性定义为 Optional。所以我只看到缺点而不是任何好处
强烈反对,尽管他们的意图是,Java Optionals 非常适合这个目的。唯一的缺点是序列化,它可以通过大多数现代序列化库(例如杰克逊的 Jdk8Module)轻松解决。以这种方式使用 Optionals 会产生更清晰的客户端代码 (Optional.map/orElse/ifPresent),并且不会意外忘记可以为空的内容。 null 引用的创建者自己称其为十亿美元的错误:infoq.com/presentations/…【参考方案2】:
我认为这是一个理论问题。
可选值的概念来自函数式语言世界。这些语言通常还支持语言级别的模式匹配,并允许您对可选值进行模式匹配。
在函数式语言中,函数调用通常返回一个可选值,其他代码可以对其进行模式匹配。
我从未见过将可选参数作为参数传递,但这并不意味着这是一个糟糕的想法。不过看起来很奇怪。
【讨论】:
感谢您的回答!我知道它在例如 lambda 表达式中特别有用,如果我理解正确,您是否也认为将其用作属性是一种好习惯?以上是关于将 Optional 用作类中的属性是一种好习惯吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
使用表单属性并将输入元素放在 HTML 中的表单标记之外是一种好习惯吗?
将@NamedQuery 用于单列选择(J2EE/JPA、Hibernate)是一种好习惯吗?