在网上搜索如何以多态方式对对象进行深层复制时,我找到了一个声称可以解决该方法的许多问题的解决方案clone()
,例如无法克隆final
字段。该解决方案在实现中结合了受保护的复制构造函数的使用clone()
,基本上是这样的(从引用页面复制的示例):
public class Person implements Cloneable
{
private final Brain brain; // brain is final since I do not want
// any transplant on it once created!
private int age;
public Person(Brain aBrain, int theAge)
{
brain = aBrain;
age = theAge;
}
protected Person(Person another)
{
Brain refBrain = null;
try
{
refBrain = (Brain) another.brain.clone();
// You can set the brain in the constructor
}
catch(CloneNotSupportedException e) {}
brain = refBrain;
age = another.age;
}
public Object clone()
{
return new Person(this);
}
…
}
的clone()
方法Brain
可以以类似的方式实现。
根据该方法的文档clone()
,似乎该方法的所有“约定”都“不是绝对要求”,“返回的对象应通过调用获得super.clone()
”只是一种约定。
那么,这个实现真的不正确吗?为什么?
如果它是正确的,为什么它没有成为一种设计模式?这有什么缺点???
谢谢,彼得