2015-03-13 28 views
5

我在Java 8中读了一些关于Optional(遗憾的是我不记得在哪里)的用途,我很惊讶作者没有提到Optional作为一个类的属性。在一个类中使用Optional作为属性是否是一种很好的做法?

由于我在课堂上使用可选项很频繁,所以我想知道这是否是一种好的做法。或者我可以更好地使用普通属性,当它们没有设置时返回null

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

我想举一个例子来阐明。我有一个类Transaction,这是建立这样的:

public class Transaction { 

    private Optional<Customer> = Optional.empty(); 
    .... 

VS

public class Transaction { 

    private Customer = null; 
    .... 

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

+0

@AdamSiemion在这里,我们是在谈论番石榴的“可选”或Java 8的“可选”吗? – Jesper 2015-03-13 13:44:41

+0

@AdamSiemion感谢您的链接!我没那么有经验,所以不知道番石榴已经拥有了它。然而,这里提到的主要原因是“可选”有三种可能性:存在,不存在和无效。 Java 8已经不存在了,所以参数无效了。 – bashoogzaad 2015-03-13 13:45:35

+0

@bashoogzaad是否有三个(null,absent,present)或两个选项(null/empty,present)它不会改变'Optional'的用途。 – 2015-03-13 13:57:36

回答

14

的Java 8的Optional的主要目的在于从方法的返回值,而不是Java类的属性,如Optional in Java SE 8描述:

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

这里的关键是关注用作返回类型。 该类明确地不打算用作Java Bean的属性。对此的见证是Optional未执行Serializable,这对于广泛用作对象的属性通常是必需的。

+0

感谢您的回答!通过'Optional'知道创作者的意图是非常有帮助的。关于'Serializable'实现的争论并不完全清楚,但那是我的错,因为我没有使用它。 – bashoogzaad 2015-03-13 13:54:59

+4

关于你已经链接的博客有趣的是,你引用的部分是[StackOverflow答案](http://stackoverflow.com/a/26328555/2711488) – Holger 2015-03-13 14:57:14

0

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

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

在函数式语言中,函数调用通常会返回其他代码可能匹配的可选值。

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

+0

感谢您的回答!我知道它在例如lambda表达式中特别有用,如果我正确理解了你,你还认为将它用作属性是一个好习惯吗? – bashoogzaad 2015-03-13 13:53:05

相关问题