2009-06-19 37 views
1

我正在尋找一些構建不可變類的有效方法,就像Java的String類一樣。使對象不可變的可能方法

+0

你在找一個類似String功能的類嗎?我一開始並沒有這樣讀過你的問題,但是如果你這樣做,我會用一些String特定的例子來改變我的答案。 – Jorn 2009-06-19 09:47:08

+0

字符串是Java中的特殊公民。它不完全是一個原始類型,但你也不能認爲它是一個類。字符串是重載+運算符的唯一「類」。添加兩個字符串將得到一個新的。操作符重載不適用於常規類。 – kgiannakakis 2009-06-19 09:52:10

+0

不能考慮String類嗎??? – 2009-06-19 09:57:20

回答

8
  1. 所有字段必須 private,最好final
  2. 確保類不能 覆蓋 - 使課堂最後, 或使用靜態工廠,並保持 構造私人
  3. 字段必須填充 構造函數/工廠
  4. 不要爲 字段提供任何setters
  5. 小心收藏。使用 Collections.unmodifiable*。此外,收藏應該只包含一個不可改變的對象
  6. 所有干將必須提供 不可變對象或使用defensive copying
  7. 不提供 改變 對象的內部狀態的任何方法。

Tom Hawtin指出final可以是可選的。 Stringclass有一個緩存hash var僅在調用散列函數時才分配。

1

如果一個對象的所有字段都不可修改,則對象是不可變的,所以這些字段必須是final。如果你不希望你的對象被子類化,那麼你也可以讓它自己成爲final,就像String一樣。 要輕鬆構建一個不可變的對象有很多的信息,你應該看看Factory Pattern

欲瞭解更多信息,請參閱Wikipedia

1

如果您填充使用構造各個領域,使場決賽 - 你是中途那裏。

如果這些字段使用自定義類型 - 您可能還需要使它們不可變。

任何屬於集合的字段都應該使用不可修改的集合 - 以確保安全。

你需要擔心的對象圖!

對象上的任何方法都需要注意非最終字段。例如。 String.add創建一個新的字符串。如果你需要改變一個字段 - 通過拷貝構造函數來完成。

最後使對象最終。

相關問題