不可變類

N1ce2cu發表於2024-07-13

不可變類

  • 一個類的物件在透過構造方法建立後如果狀態不會再被改變,那麼它就是一個不可變(immutable)類。它的所有成員變數的賦值僅在構造方法中完成,不會提供任何 setter 方法供外部類去修改。

不可變類String

1)常量池的需要

字串常量池是 Java 堆記憶體中一個特殊的儲存區域,當建立一個 String 物件時,假如此字串在常量池中不存在,那麼就建立一個;假如已經存,就不會再建立了,而是直接引用已經存在的物件。這樣做能夠減少 JVM 的記憶體開銷,提高效率。

2)hashCode 需要

因為字串是不可變的,所以在它建立的時候,其 hashCode 就被快取了,因此非常適合作為雜湊值(比如說作為 HashMap的鍵),多次呼叫只返回同一個值,來提高效率。

3)執行緒安全

就像之前說的那樣,如果物件的狀態是可變的,那麼在多執行緒環境下,就很容易造成不可預期的結果。而 String 是不可變的,就可以在多個執行緒之間共享,不需要同步處理。

因此,當我們呼叫 String 類的任何方法(比如說 trim()substring()toLowerCase())時,總會返回一個新的物件,而不影響之前的值。

自定義不可變類

1)確保類final的,不允許被其他類繼承。

2)確保所有的成員變數(欄位)是final的,這樣的話,它們就只能在構造方法中初始化值,並且不會在隨後被修改。

3)不要提供任何setter方法。

4)如果要修改類的狀態,必須返回一個新的物件。

相關文章