克隆是一种基本的编程模式。事实上,Java在很多方面可能实现得很差,但这丝毫没有减少克隆的必要性。而且,很容易实现克隆,无论你希望它如何工作,浅层的,深层的,混合的,无论什么。如果愿意的话,甚至可以为函数使用clone名称,而不实现Cloneable。
假设我有类A、B和C,其中B和C是从A派生的。如果我有一个A类型的对象列表,如下所示:
ArrayList list1;
ArrayList list2 = new ArrayList();
for(A a : list1) {
list2.add(new A(a));
}
如果对象实际上是B或C类型的,则不会得到正确的副本。如果A是抽象的呢?现在,有人提出:
ArrayList list2 = new ArrayList();
for(A a : list1) {
if(a instanceof A) {
list2.add(new A(a));
} else if(a instanceof B) {
list2.add(new B(a));
} else if(a instanceof C) {
list2.add(new C(a));
}
}
你想做的是:
ArrayList list2 = new ArrayList();
for(A a : list1) {
list2.add(a.clone());
}
很多人都指出了克隆的基本Java实现存在问题的原因。但是,这样很容易克服:
public A clone() {
return new A(this);
}
B类:
@Override
public B clone() {
return new B(this);
}
C类:
@Override
public C clone() {
return new C(this):
}