2021/1/10

如何創建一個不可變類別

  • 動機 
    • 在併發的情境裡 , 因為共享記憶體所以每一個線程會複製一份作為工作變數 , 導致資料一致性問題 , 所以當資料確保不可變可以降低併發錯誤率
  • 如何建立不可變物件
    • 所有成員變數必須是private
    • 最好同時用final修飾(非必須)
    • 不提供能夠修改原有物件狀態的方法 , 最常見的方式是不提供setter方法
    • 如果提供修改方法,需要新建立一個物件,並在新建立的物件上進行修改
    • 通過構造器初始化所有成員變數,引用型別的成員變數必須進行深拷貝(deep copy)
    • getter方法不能對外洩露this引用以及成員變數的引用
    • 最好不允許類被繼承(非必須) , 例如Final
  • 淺拷貝與深拷貝

  • 透過反射機制仍然可以改變值

1 則留言:

  1. 以前做過這塊,
    基本上有兩種做法,
    一種是最直覺的每層淺拷貝一路拷拷拷下去, 不過有點麻煩

    另一種是針對記憶體, 直接把物件序列化在new一塊新的記憶體, 簡單暴力 .

    回覆刪除

test2