1. 程式人生 > >java不可變類

java不可變類

定義

不可變類指當類被例項化後,該類的成員變數均不可被改變。如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;
    }
    ...
}

如上程式碼所示,可以觀察到以下設計細節:

  1. String類被final修飾,不可繼承
  2. string內部所有成員都設定為私有變數
  3. 不存在value的setter
  4. 並將value和offset設定為final。
  5. 獲取value時不是直接返回物件引用,而是返回物件的copy.

這都符合上面總結的不變型別的特性,也保證了String型別是不可變的類。