2016-02-26 65 views
1

在聲明上實例化收集字段是否是一種好的做法?例如:我應該在聲明上實例化收集字段嗎?

class A { 
    private List<String> list = new ArrayList<>(); 

    public List<String> getList() { 
     return list; 
    } 

    public setList(List<String> list) { 
     this.list = list; 
    } 
} 

爲什麼我需要它是避免檢查空這樣的理由:

if (a.getList() != null) 

回答

4

這是更好地避免有null值在可能的情況。您也可以將該字段設爲final,以便您知道它永遠不會是null有註釋可以讓您跟蹤值不能爲空。

private final List<String> list = new ArrayList<>(); 

@NotNull 
public List<String> getList() { 
    return list; 
} 

如果你這樣做以後

if (a.getList() != null) // your IDE can tell you this is always true. 
1

意見不盡相同,但在這種情況下,我肯定會認爲:空集是遠遠超過可空更清晰,更純淨的空能集合。

正開始出現也意味着你可以做賦予一些利益領域final,但在這裏你必須讓你的setList()改爲調用clear()addAll()的新項目。因此,也許沒有多少益處單獨在這裏,但在其他情況下,它的優點...

0

我認爲一個更好的地方開始你的對象是類的構造
一個全面的解釋:Should I instantiate instance variables on declaration or in the constructor?

Instantiating object in a constructor

+1

小心闡述爲什麼這會更好? – Nfear

+0

@Nfear請參考此回答[在構造函數中實例化對象](http://stackoverflow.com/a/9282784/2119902) – Ehsan

+1

我明白了。因此,對於不使用數組列表的情況。可以避免初始化以節省內存。 – Nfear

0

有了你顯示,setList()可以設置null值,所以不能刪除null檢查的特定代碼。不過,我會建議你改變設置1)拒絕空值,或2)設置Collections.emptyList()而不是null,或3)設置新的ArrayListLinkedList而不是null。 空值始終是一個需要處理的痛苦,對於集合來說這更糟糕。許多最佳實踐建議禁止空集合。我完全同意。

更改此類行爲意味着您需要查看getList()的所有呼叫站點,並檢查此類更改是否會破壞它。如果確實如此,那麼您需要更改解決方案或修改客戶端代碼。

相關問題