2014-08-30 17 views
3

對於創建不可變類我有疑問。強制使字段作爲final來使類不可變

根據java文檔。

  1. 我做出了最終的類(沒有人可以延長)
  2. 場是私有的。
  3. 無設置功能。
  4. 如果字段是可變的,則發送字段的克隆拷貝。

我的疑問是,強制要求我的班級成績爲final

+0

當然。否則,有人可能會以可變的方式擴展它。 – 2014-08-30 16:22:36

+0

@OliCharlesworth,這個類是最終的,所以它不能被子類化。 – Paul 2014-08-30 16:24:18

+0

@保羅:啊,對不起,我誤解了這個問題(以爲這是關於*班*的最終決定)。 – 2014-08-30 16:24:46

回答

3

如果沒有setter方法(並且大概沒有其他方法影響字段的值)並且字段本身是private,則將它們標記爲final有點多餘。儘管如此 - 這是許多項目標準遵循的良好的防禦性做法。

+1

私有字段不能被繼承類訪問(這是'private'和'protected'之間的區別)。此外,OP已經提到這個階級本身是最終的,所以它不能延伸。 – Mureinik 2014-08-30 16:24:34

+0

@YS Bhai提到這一點,同樣的問題已經回答[這裏](http://stackoverflow.com/questions/16061030/must-all-properties-of-an-immutable-object-be-final) – 2014-08-30 16:24:55

+0

@SotiriosDelimanolis好因爲基類沒有setter方法。 – Paul 2014-08-30 16:25:32

0

不可變=不可更改。所以最終確定屬性是個好主意。如果一個對象的所有屬性都不能被保護,我不會說這個對象是不可變的。

但是如果一個對象沒有爲它的私有屬性提供任何setter對象,它也是不可變的。

immutable對象永遠不會改變,但它所指的任何東西都可能會改變。 Deep immutability更強大:基礎對象和任何可以從中導航的對象都不會改變。

+0

如果我們談論*行爲*不變性,那麼只要內部狀態從來沒有可觀察到的效果,就很可能會改變內部狀態。典型的例子是某種引用計數機制。 – 2014-08-30 16:33:25

2

雖然爲很多人說其不是強制性標記字段作爲最終我會ATLEAST說在一種情況下,我能想到的,你需要標記字段,最後,這是在的情況下,如果你想使你的不變類線程安全。

根據Java的內存模型: -

的對象被認爲是完全初始化時,它的構造完成。在該對象完全初始化後,只能看到對象的引用的線程保證能夠看到該對象最終字段的正確初始化值。

JLS final thread safety

所以,如果你有你在構造函數非最終變量初始化實例變量的不可變類則沒有線程安全保障作爲寫入到非最終變量可能不可見即使在構造完全運行其他線程(注重建,這是非常困難的,因爲這可能會在高併發應用程序發生)

相關問題