将 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 中所述:

当然,人们会做他们想做的事。但我们在添加此功能时确实有明确的意图,它不是通用的MaybeSome 类型,就像很多人希望我们这样做一样。 我们的目的是为库方法返回类型提供一种有限的机制,在这种情况下,需要一种明确的方式来表示“无结果”,而使用 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 中的表单标记之外是一种好习惯吗?

C# 中的重载运算符实际上是一种好习惯吗? [关闭]

将@NamedQuery 用于单列选择(J2EE/JPA、Hibernate)是一种好习惯吗?

将函数放在 useEffect 中是一种好习惯吗?

对 HTML 表单的 action 属性使用空 URL 是一种好习惯吗? (动作="")

在 MySQL 的表名中使用点是一种好习惯吗