2014-10-31 23 views
3

當使用Optional<T>與可爲空的字段時,它是更慣用的具有設定器採取什麼是更多的慣用:制定者採取可選<T>或只是T?

  • 一個Optional<T>
  • 只是T,然後它有如下?
public class Bar { 
    private Optional<T> foo; 

    public void setFoo(T foo) { 
     this.foo = Optional.<T>fromNullable(foo); 
    } 

    public Optional<T> getFoo() { 
     return foo; 
    } 
} 
+0

呃,這取決於...你想要什麼'.getFoo()'返回? – fge 2014-10-31 19:05:15

+0

這也是一個問題,但現在'.getFoo()'返回一個'Optional ' – 2014-10-31 20:46:42

回答

5

我會考慮不這樣做,並且只將內部值存儲爲T,並且只在API級別具有Optional。

public class Bar { 
    private T foo; 

    public Optional<T> getFoo() { 
     return Optional.<T>fromNullable(foo); 
    } 

    public void setFoo(T foo) { 
     this.foo = foo; 
    } 
} 
+1

我唯一的評論是可能更習慣於'this.foo = Preconditions.checkNotNull(foo)',並且擁有一個單獨的'clearFoo()'方法。你可以額外增加'setFoo(可選 foo)'這''this.foo = foo.orNull()'。 – 2014-10-31 19:29:34

+0

像T一樣存儲它有沒有什麼好處,或者只是味道更好? – 2014-10-31 20:52:59

+2

@SauloSilva在[本答案](http://stackoverflow.com/a/24564612/502399)中討論了一些好處(在Java 8的「可選」中類似)的上下文中。 – 2014-10-31 21:02:31

0

後者將是我的建議。但是更客觀的是哪一種比較習慣。

public class Bar { 
    private T foo; 

    public void setFoo(T foo) { 
     this.foo = Optional.<T>fromNullable(foo); 
    } 
} 
3

一般情況下,我建議:

public void setFoo(T foo) { 
    this.foo = checkNotNull(foo); // don't allow null at all! 
} 

然後,如果用戶具有價值,他們知道可能是null,他們可以這樣做:

if (foo != null) { 
    bar.setFoo(foo); 
} 
相關問題