2013-01-14 127 views
4

在我目前的項目中,我有一個類,它的實例存儲在一個變量。這個實例應該可以被項目中的所有其他類訪問,但它只能由它自己的類來修改。類變量:公共訪問只讀,但私人訪問r/w

我怎樣才能做到這一點?

+0

你是什麼意思與 「它的實例」?是否只有一個類的實例? (單身) – flup

+0

是的,這就是我的意思。 – th3falc0n

回答

18

public吸氣但沒有public制定者。並且該字段本身private

+3

而該字段的類型必須是不可變的。 –

+1

如果該字段的類型不可變,您可以始終返回其深層副本而不是其自身的引用,以確保該字段不能被其他人修改。 – MrSmith42

4

簡而言之,稱爲immutable objectObject的狀態在構建後不能更改。

String是不可變的Class的常見例子。

做一個classimmutable通過以下各項

  • 確保類不能overridden - 使classfinal,或使用 static工廠,並保持構造私有。
  • 使字段privatefinal
  • 力呼叫者在單個步驟中的, 代替使用no-argument constructor隨後 調用setXXX方法結合完全構造的對象。
  • 沒有提供可以以任何方式改變對象 的狀態的任何方法 - 不只是setXXX方法,但可以改變 狀態
  • 如果類具有可變對象字段的任何方法,那麼他們必須 在類和其調用者之間傳遞時進行防禦複製。
1

有人建議「公共獲得者,但沒有私人領域的公共設置者」。

注意:如果該字段是原始類型,這將僅適用。
如果它是帶setter的對象,則內容仍然可以修改;因此不是隻讀的。

有趣的是,看到Java語言提供了一些構造,使返回類型只讀而不必進行深度複製/克隆。

我很喜歡 只讀getEmployee的成像(){ ...}