2015-03-13 70 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

相關問題