定義:是指當創建這個類的實例後,就不允許修改它的值了,也就是說,一個對象一旦被創建出來,在其整個生命週期內,它的成員變量不允許被修改。
在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”並沒有改變,還在內存中。
創建不可變類遵循的原則:
- 所有的成員變量被private所修飾。
- 沒有寫或者修改成員變量的方法,例如set方法
- 確保類中所有方法不會被子類覆蓋,通過把類定義爲final,或者把方法定義爲final實現。
- 如果一個類成員不是不可變量,那麼在成員初始化或者使用get方法獲取該成員變量時,需要通過clone方法來確保類的不可變性。
- 如果有必要,可以使用覆蓋Object類的equals方法和hashcode方法。在equals方法中,確保兩個對象的屬性值相等,並且在equals方法相等時,確保hashcode方法返回的值相等,這可以保證這些對象能正確的放入HashMap或HashSet中。
注意:由於類的不可變性,最好提供帶參數的構造方法初始化。
優點:使用簡單、線程安全、節省內存
缺點:不可變類的對象會因爲值得不同而產生新的對象,從而導致無法預料的問題。