3

的IntelliJ提醒我關於「集合場歸來」如果我這樣做返回集合場的警告 - 制定者和建設者

private List<String> myList; 

public List<String> getMyList() { 
    return myList; 
} 

代碼檢查的說明指出:

報告任何嘗試從方法返回數組或集合字段。由於數組或集合可能會通過調用方法修改其內容,因此此構造可能導致對象的狀態被意外修改。雖然偶爾出於性能原因有用,但這種構造本身就是容易出錯的。

我完全理解的問題,但我不知道爲什麼我沒有警告過做同樣的制定者和建設者

public MyListClass (List<String> myList) { 
    this.myList = myList; 
} 

public void setMyList (List<String> myList) { 
    this.myList = myList; 
} 

,我認爲可能會導致同樣的問題。

不應該爲獲取和設置集合創建新的集合嗎?因此,不僅

return new ArrayList<String>(this.myList); 

而且

this.myList = new ArrayList<String>(myList); 

(忽略使返回列表不可修改或在本例中檢查空)

+2

setter *顯式*接受在類之外創建的數據。 getter *可能會不適當地暴露內部依賴關係。但是,是的,這可能會導致相同類型的問題。 –

回答

1

可以使用Java | Assignment issues | Assignment to Collection or array field from parameter檢查,以獲得制定者和建設者的警告了。