一
同样是面试遇到的问题,基本想到的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; } }