2016-02-16 34 views
-2

很明顯,不可變對象應該在大多數時間和任何可能的時候使用。 編輯當不可變對象不能在java中使用時,最好使用mutable?

這裏有一些文章來鼓勵這種做法: https://docs.oracle.com/javase/tutorial/essential/concurrency/immutable.html

  • 是簡單的構建,測試和使用
  • 是自動線程安全的,並沒有同步問題
  • 不需要拷貝構造函數
  • 不需要實現克隆
  • 允許的hashCode使用延遲初始化,並緩存它的返回值
  • 不需要被防守複製爲現場使用時
  • 好好地圖鍵和SET元件(這些對象不能改變 狀態,而在收集)
  • 有自己的班級不變的構造時建立的一次,它 永遠需要再次檢查
  • 始終有「失敗原子」(由約書亞布洛赫所使用的術語):如果一個 不可變對象拋出例外,它從來沒有留在 不受歡迎的或inde終止狀態

http://www.javapractices.com/topic/TopicAction.do?Id=29

但是在那裏場景中不變的對象都不好使用或不能使用某種原因?基於

+4

爲什麼顯而易見的是不可變對象最應該被使用? – Maroun

+0

*然而,有些情況下,不可變對象不適合使用或由於某種原因不能使用*? - 簡單。您的設計阻止您創建實例*不可變*。這一切都歸結於設計。如果你的設計允許你,那麼使實例不可改變,因爲它們可以提高性能並防止不必要的狀態變化 – TheLostMind

+0

帶引號的文本*沒有聲明不可變對象應該用得最多。 – Maroun

回答

1

思考框架是由一個不可改變的對象,因爲他們需要構造函數注入複雜:

在Java中,這迫使我們始終提供所有必要的依賴沒有默認參數 構造壓倒一切的可能是骯髒的 構造函數參數名稱通常不能通過反射獲得,這迫使我們依賴於參數順序來依賴於分辨率

具有不變性,任何時候您需要修改數據時,都需要創建一個新對象。這可能是昂貴的。假設需要修改消耗數兆字節內存的對象中的一個位:您需要實例化一個新對象,分配內存等。如果需要多次執行此操作,可變性將變得非常有吸引力。

+0

構造函數注入不考慮改變狀態。它提供了對象構造的價值。 – Adelin

1

當然有很多。簡單的情況是當你想修改對象的狀態。

與Person對象的name屬性一樣。

如果Person類對象不可變,那麼您需要使用name屬性的新值創建一個新對象。它帶來了創建一個新的Person項目的開銷。有時不可變的對象會提高性能。就像在線程中一樣。

如果Person類是可變的,那麼您需要做的就是使用setter方法更改狀態。不需要創建新的對象。但在多個線程中使用可能不安全。

如果安全性需要在更改狀態之前進行檢查,而不是跨領域問題,並且不屬於Person類。

java中的String類也是不可變的。 public final class String。這就是爲什麼你需要StringBuffer & StringBuilder類來創建可變字符序列。

還有許多框架如Hibernate recommends non-final classes。所以最終會創建更多的可變類來產生可變對象。

它最好分析上下文或場景,並在可變或不可變之間進行選擇。

相關問題