2012-11-01 33 views
5

說到在Java中處理「nulls」的最佳實踐(特別是「List」返回),從實體類的getMethod返回「Collections.emptyList()」是一個好習慣?或者我們應該保持實體/數據類/方法整潔乾淨,並且始終返回其值(即使爲空),然後在代碼中的其他位置處理null;使用Collections.emptyList()和null處理

Class Reference{ 

private Reference reference; 

@XmlElement(name = "Reference") 
public List<Reference> getReference() { 
    if(reference==null){ 
     return Collections.emptyList(); 
    } 
    return reference; 
} 

public void setReference(List<Reference> reference) { 
    this.reference = reference; 
} 
} 

或更好地處理空「之後」我使用基本的get方法?

編輯/警告:只爲我的情況我注意到這種方法崩潰我的代碼我不知道爲什麼,當我稍後調用;

References ref= (References) jaxbUnmarshaller.unmarshal(xmlReader) 

我得到一個不支持的操作異常,但是當我從清理我collections.emtpyList工作getMethod確定。所以用@XmlElement標籤

回答

2

返回非空集合確實是一種很好的做法。它節省了從做

if (list != null) { 
    for (Item i : list) { 
     ... 
    } 
} 

每個呼叫者所以上面的代碼是好的。但是在reference變量中禁止任何空值會更好。如果您擁有列表的setter,那麼如果傳遞的列表爲null,或者將null轉換爲空集合,則使其拋出異常。這樣,即使您的類中的代碼也不必擔心引用變量爲空。

如果您需要區分空列表和空列表,請考慮使用Guava's Optional類,這使事情變得更加清晰。

剛一說明:因爲你有一個列表,該變量應該命名爲references(以最終小號),以及存取應該被命名爲getReferencessetReferences

+0

謝謝所有偉大的建議,我們可以說,在實體類的方法,這空處理,也適用於非列表類型,如字符串或整數? – Spring

+0

只有當您明確希望變量爲空時,纔會使用Integer而不是int。否則,使用int是一個更好的選擇。關於字符串,null通常用於表示該屬性未設置,而不是空字符串。但是調用者通常不會迭代String字符。 –

+0

只爲我的情況這種方法崩潰我的代碼我不爲什麼,當我以後調用(引用)jaxbUnmarshaller.unmarshal(xmlReader)。我得到一個不受支持的操作異常,並工作時,我從collections.emtpyList清理我的getMethod .. – Spring

3

一般來說,null和「空」的使用可以有不同的語義的注意事項:null的意思是「它不存在」,而「空」的意思是「它的存在,但沒有什麼在裏面」。

如果你的類是這樣一個概念,即「不存在」和「空」,然後返回一個空集是更好的無語義差別:它在所有來電者節省了if聲明,使他們的代碼看起來更乾淨。此外,在這種情況下,我會首先將this.reference設置爲Collections.emptyList(),並從吸氣劑中移除if。當然在這種情況下,你的setter需要null - 檢查它的參數。

+0

我更新的問題 – Spring

1

一般來說:取決於(如果您需要能夠區分缺失列表和空列表)。

在XML訪問庫的情況下,似乎總是返回一個可變的列表,以便您可以通過它更新實體。至少這就是所有自動生成的WS- *代碼所做的。

例如,添加一個參考,你會做

x.getReferences().add(someReference); 

這將導致異常,如果你返回null。

OTOH,該約定不具有或需要參考列表的setter(您只需清除列表並添加所有內容而不是設置新列表)。

3

根據我的經驗,在編寫Java時使用「按合同編程」或「按合同設計」(Link)。
這意味着,在你的例子中,如果你的引用不是由外部實體設置,那麼你只需返回一個空值。

1
private Reference reference = Collections.emptyList(); 

public List<Reference> getReference() { 
    return reference; 
} 

public void setReference(List<Reference> reference) { 
    if(reference==null) 
     reference = Collections.emptyList(); 
    this.reference = reference; 
}