复制构造函数与clone

前言

对一个对象的复制,通常实现Cloneable接口使用clone方法。
但这有一个设计缺陷。Cloneable没有clone方法,反而在Object里面调用了native修饰的clone方法。

缺陷

1
2
public interface Cloneable {
}

很明显看到,Cloneable是一个空接口,实现Cloneable只是为了在调用clone方法时,不抛出CloneNotSupportedException异常。
而且使用的是native修饰的clone方法,对应用开发者是透明的,开发者对clone方法不可控。

使用复制构造函数解决

Josh Bloch推荐使用复制构造函数来实现clone功能,实际上,HashMap也通过复制构造函数进行clone。

1
2
3
4
5
6
7
// java.util.HashMap
public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable {
public HashMap(Map<? extends K, ? extends V> m) {
this.loadFactor = DEFAULT_LOAD_FACTOR;
putMapEntries(m, false);
}
}

参考资料