不可變類
- 一個類的物件在透過構造方法建立後如果狀態不會再被改變,那麼它就是一個不可變(immutable)類。它的所有成員變數的賦值僅在構造方法中完成,不會提供任何 setter 方法供外部類去修改。
不可變類String
1)常量池的需要
字串常量池是 Java 堆記憶體中一個特殊的儲存區域,當建立一個 String 物件時,假如此字串在常量池中不存在,那麼就建立一個;假如已經存,就不會再建立了,而是直接引用已經存在的物件。這樣做能夠減少 JVM 的記憶體開銷,提高效率。
2)hashCode 需要
因為字串是不可變的,所以在它建立的時候,其 hashCode 就被快取了,因此非常適合作為雜湊值(比如說作為 HashMap的鍵),多次呼叫只返回同一個值,來提高效率。
3)執行緒安全
就像之前說的那樣,如果物件的狀態是可變的,那麼在多執行緒環境下,就很容易造成不可預期的結果。而 String 是不可變的,就可以在多個執行緒之間共享,不需要同步處理。
因此,當我們呼叫 String 類的任何方法(比如說 trim()
、substring()
、toLowerCase()
)時,總會返回一個新的物件,而不影響之前的值。
自定義不可變類
1)確保類final的,不允許被其他類繼承。
2)確保所有的成員變數(欄位)是final的,這樣的話,它們就只能在構造方法中初始化值,並且不會在隨後被修改。
3)不要提供任何setter方法。
4)如果要修改類的狀態,必須返回一個新的物件。