Java-不可變類

定義:是指當創建這個類的實例後,就不允許修改它的值了,也就是說,一個對象一旦被創建出來,在其整個生命週期內,它的成員變量不允許被修改。


在Java中,所有基本類型的包裝類都是不可變類,還包括String。
關於String,對如下的代碼進行解讀:

public strictfp class Main {

    public static void main(String[] args){
        String str = "xu";
        str += "jinliang";
        System.out.println(str);
    }
}

結果

原理解析:此處 大家很容易誤認爲String不是不可變類,因爲它是可以修改的。但是實際上,String str = “xu”;表示聲明瞭一個變量str,指向內容爲”xu”的String對象,但是 += “jinliang”;並沒有改變前一個對象的值,而是str指向了另一個內容爲“xujinlaing”的String對象,原來是String對象“xu”並沒有改變,還在內存中。


創建不可變類遵循的原則:

  1. 所有的成員變量被private所修飾。
  2. 沒有寫或者修改成員變量的方法,例如set方法
  3. 確保類中所有方法不會被子類覆蓋,通過把類定義爲final,或者把方法定義爲final實現。
  4. 如果一個類成員不是不可變量,那麼在成員初始化或者使用get方法獲取該成員變量時,需要通過clone方法來確保類的不可變性。
  5. 如果有必要,可以使用覆蓋Object類的equals方法和hashcode方法。在equals方法中,確保兩個對象的屬性值相等,並且在equals方法相等時,確保hashcode方法返回的值相等,這可以保證這些對象能正確的放入HashMap或HashSet中。

注意:由於類的不可變性,最好提供帶參數的構造方法初始化。


優點:使用簡單、線程安全、節省內存
缺點:不可變類的對象會因爲值得不同而產生新的對象,從而導致無法預料的問題。

發佈了53 篇原創文章 · 獲贊 27 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章