- 動機
- 在併發的情境裡 , 因為共享記憶體所以每一個線程會複製一份作為工作變數 , 導致資料一致性問題 , 所以當資料確保不可變可以降低併發錯誤率
- 如何建立不可變物件
- 所有成員變數必須是private
- 最好同時用final修飾(非必須)
- 不提供能夠修改原有物件狀態的方法 , 最常見的方式是不提供setter方法
- 如果提供修改方法,需要新建立一個物件,並在新建立的物件上進行修改
- 通過構造器初始化所有成員變數,引用型別的成員變數必須進行深拷貝(deep copy)
- getter方法不能對外洩露this引用以及成員變數的引用
- 最好不允許類被繼承(非必須) , 例如Final
- 淺拷貝與深拷貝
- 透過反射機制仍然可以改變值
以前做過這塊,
回覆刪除基本上有兩種做法,
一種是最直覺的每層淺拷貝一路拷拷拷下去, 不過有點麻煩
另一種是針對記憶體, 直接把物件序列化在new一塊新的記憶體, 簡單暴力 .