2014-12-25 46 views
2

我最近發現了java 8中的Optional類型,並開始在我的最新項目中使用它。我用它喜歡:Java 8可選用法

public class User{ 
    private int id; 
    private String email; 
    private Optional<String> mobile; 
    public User(int id, String email, Optional<String> mobile){ 
     ... 
    } 
    public int id(){...} 
    public int email(){...} 
    public Optional<String> mobile(){...} 
} 

今天,我正在探索更多可選的,當我遇到其中明確指出,使用可選的比返回類型其他地方是一個不好的做法帖子來了。從多個來源驗證了這一點後,我改變了我的代碼,如:

public class User{ 
    private int id; 
    private String email; 
    private String mobile; 
    public User(int id, String email, String mobile){ 
     ... 
    } 
    public int id(){...} 
    public int email(){...} 
    public Optional<String> mobile(){ 
     return Optional.ofNullable(mobile); 
    } 
} 

這是一個可接受的解決方案嗎?具體來說,我改變了一些方法簽名採取任選到T,然後在方法內我把T轉換爲Optional.ofNullable(t),以便我可以使用像ifPresent,orElse,過濾器,地圖等方法。

+0

你有什麼來源說有可選的作爲一個領域是不好的做法?有什麼缺點? – aioobe

+0

@aioobe請訪問https://stackoverflow.com/questions/23454952/uses-for-java8-optional?rq=1參數是這是一個不好的java練習,我們應該使用方法重載,構造函數重載而不是服用在可選參數中。 – gladiator

+0

是的。這個答案很有意義。 – aioobe

回答

2

我認爲你的選擇實施返回Optional.ofNullable是好的。

我不得不在做類Serializable時自己做這個改變。正如Stuart Marks在his answer中所說的那樣,它使得該字段不是可選的(您總是可以使用mobile()而不是mobile來獲取字段的Optional視圖)。

+0

我最初被誤導了,因爲我參考了本教程http://www.oracle.com/technetwork/articles/java/java8-optional-2175753.html,它清楚地使用了可選字段。你對此有何想法? – gladiator

+0

我沒有那麼多的經驗,但我不明白爲什麼這是不好的做法。如果你的類有很多空檢查,可選字段可以提高可讀性/可維護性。另一方面,如果一個人有很多空檢查,那麼也許應該把這個班分成兩部分。如果你在'User' /'mobile'例子中有幾個語句,比如'if(mobile == null){...} else {...}',而邏輯實際上取決於mobile是否爲null或不,也許有兩個'User'子類是有意義的:'UserWithMobile'和'UserWithoutMobile'。 – aioobe

+0

我不確定我是否認爲這是不好的做法,現在內部可以訪問'mobile'字段並生成一個'空指針'。那麼,爲什麼不把它作爲一個可選的存儲它是不可能的。 – mogronalol