2012-01-25 44 views
5

我有一類是不可變的不變性一類當一個實例變量存在的ArrayList

假設我有ArrayList類型的成員變量的吸氣劑的方法。在那種情況下,當我得到對該變量的引用時,我可以添加或從中刪除一個元素。在那種情況下,不變性似乎受到侵犯。

任何人都可以詳細解釋這個概念嗎?

+2

請參閱http://stackoverflow.com/questions/8892350/immutable-vs-unmodifiable-collection – Zaki

+1

另請參閱約書亞布洛赫的「有效的Java」,條目24:在需要時製作防禦性副本。本章可在線獲取[http://www.informit.com/articles/article.aspx?p=31551&seqNum=2] – mike9322

+0

如果您的類應該是全不可變​​的,請將對該列表的引用保存爲_in您的class_(複製後)作爲「UnmodifiableList」的實例。不需要(額外的)防禦性副本,並且它可以防止_your_班級在維護期間修改它。 –

回答

3

你確實是對的。不可侵犯性被侵犯。

要使一個類不可變,您需要確保其所有getter都返回其狀態可能發生更改的任何類的安全副本。

3

您不應該提供類型爲ArrayList的變量。只提供List並確保吸氣做了下一個:

  1. 返回列表
  2. 的副本或返回不可修改的列表

或兩者兼而有之。

+1

返回也是不可修改的列表的副本是沒有必要的 –

0

如果您創建了X類型的更改對象的新實例,那麼X的實例將被視爲不可變。如果考慮ArrayList,則更容易理解。你有辦法改變這個列表。每個更改方法都會創建該列表的副本,並在新副本上添加/刪除/更新並返回。

相關問題