java不可變類
阿新 • • 發佈:2019-02-20
定義
不可變類指當類被例項化後,該類的成員變數均不可被改變。如JDK內部自帶的很多不可變類:Interger、Long和String等。
優點
1.執行緒安全 2.易於構造、使用和測試
類設計原則
1.class要用final修飾,保證類不能被繼承;
2.成員變數需要用private String來修飾,保證成員變數均為私有變數;
3.類中不允許提供setter方法,保證成員變數不會被改變;
4.成員變數的getter方法中返回該物件的複製物件,保證原物件的引用不被改變;
String物件的不可變性
string物件在記憶體建立後就不可改變,不可變物件的建立一般滿足以上4個原則,我們看看String程式碼是如何實現的。
public final class String implements java.io.Serializable, Comparable<String>, CharSequence { /** The value is used for character storage. */ private final char value[]; /** The offset is the first index of the storage that is used. */ private final int offset; /** The count is the number of characters in the String. */ private final int count; /** Cache the hash code for the string */ private int hash; // Default to 0 .... public String(char value[]) { this.value = Arrays.copyOf(value, value.length); // deep copy操作 } ... public char[] toCharArray() { // Cannot use Arrays.copyOf because of class initialization order issues char result[] = new char[value.length]; System.arraycopy(value, 0, result, 0, value.length); return result; } ... }
如上程式碼所示,可以觀察到以下設計細節:
- String類被final修飾,不可繼承
- string內部所有成員都設定為私有變數
- 不存在value的setter
- 並將value和offset設定為final。
- 獲取value時不是直接返回物件引用,而是返回物件的copy.
這都符合上面總結的不變型別的特性,也保證了String型別是不可變的類。