不可變類小結
阿新 • • 發佈:2018-12-05
一
同樣是面試遇到的問題,基本想到的final和private之類的都考慮到了,就是沒想到深複製和get方法得到副本這些重點
ps.String類就是個不可變類,它的物件一旦建立之後,值就不能被改變了。寫這篇的時候看了一遍原始碼,有時間了自己看下吧,寫個String類的分析太長了,,,
二
網上說的不可變類特點
1將類宣告為final,所以它不能被繼承
public final class ImmutableClass { }
2將所有的成員宣告為私有的,這樣就不允許直接訪問這些成員
3將所有的成員宣告為final,這樣只能對它們賦值一次
publicfinal 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; } }