gpt4 book ai didi

Java clone() 方法使用 new 关键字和复制构造函数而不是 super.clone()

转载 作者:行者123 更新时间:2023-12-01 14:42:39 31 4
gpt4 key购买 nike

当在网上搜索如何以多态方式深层复制对象的可能性时,我发现了 solution声称可以使用 clone() 方法解决许多问题,例如无法克隆 final 字段。该解决方案结合了在 clone() 实现中使用 protected 复制构造函数,基本上如下所示(从引用页面复制的示例):

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);
}


}

Brain的clone()方法可以用类似的方式实现。

基于documentation of the clone() method看来,这个方法的所有“约定”都“不是绝对的要求”,“返回的对象应该通过调用 super.clone() 来获取”只是一个约定。

那么,这个实现实际上是错误的吗?为什么?

如果它是正确的,为什么它没有成为一种设计模式?这有什么缺点???

谢谢,彼得

最佳答案

您正在尝试通过实现可克隆接口(interface)来克隆,但不遵循推荐的克隆契约(Contract)。

您基本上是使用复制构造函数创建新对象,我的问题是为什么您需要实现可克隆?

如果您要实现可克隆,那么您必须遵守契约(Contract)。当您在clone方法中使用复制构造函数时,我不会推荐这种方法,因为它的子类的克隆不会是子类的对象,而是Person类的对象。

还想指出的是,使用复制构造函数而不是可克隆接口(interface)是更面向对象的方法。

关于Java clone() 方法使用 new 关键字和复制构造函数而不是 super.clone(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15791427/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com