1. 程式人生 > >不可變類小結

不可變類小結

同樣是面試遇到的問題,基本想到的final和private之類的都考慮到了,就是沒想到深複製和get方法得到副本這些重點

 

ps.String類就是個不可變類,它的物件一旦建立之後,值就不能被改變了。寫這篇的時候看了一遍原始碼,有時間了自己看下吧,寫個String類的分析太長了,,,

 

網上說的不可變類特點
1將類宣告為final,所以它不能被繼承

public final class ImmutableClass {
}

2將所有的成員宣告為私有的,這樣就不允許直接訪問這些成員

3將所有的成員宣告為final,這樣只能對它們賦值一次

public
final class ImmutableClass { private final int id; private final String name; private final HashMap testMap; }

4對變數不要提供setter方法,這樣就不允許直接修改這些成員

5在getter方法中,不要直接返回物件本身,而是克隆物件,並返回物件的拷貝

public final class ImmutableClass {

    private final int id;

    private final String name;

    
private final HashMap testMap; /** * id 是基礎類 */ public int getId() { return id; } /** * String 是不可變類直接返回 */ public String getName() { return name; } /** * 可變物件的返回方法 */ public HashMap getTestMap() { //return testMap; return
(HashMap) testMap.clone(); } }

6通過構造器初始化所有成員,進行深拷貝(deep copy)

public final class ImmutableClass {

    private final int id;

    private final String name;

    private final HashMap testMap;
    /**
     * id 是基礎類
     */
    public int getId() {
        return id;
    }

    /**
     * String 是不可變類直接返回
     */
    public String getName() {
        return name;
    }

    /**
     * 可變物件的返回方法
     */
    public HashMap getTestMap() {
        //return testMap;
        return (HashMap) testMap.clone();
    }

    /**
     * 實現深拷貝(deep copy)的構造器
     *
     * @param i
     * @param n
     * @param hm
     */
    public ImmutableClass(int i, String n, HashMap hm) {
        System.out.println("Performing Deep Copy for Object initialization");
        this.id = i;
        this.name = n;
        HashMap tempMap = new HashMap();
        String key;
        Iterator it = hm.keySet().iterator();
        while (it.hasNext()) {
            key = (String) it.next();
            tempMap.put(key, hm.get(key));
        }
        this.testMap = tempMap;
    }
}