java拷贝构造函数_使用新的关键字和复制构造函数代替super.clone的Java克隆()方法...

当在网络中搜索多种可能性时如何制作对象的深层副本时,我发现solution声称可以解决许多问题,例如,clone()方法不可能克隆final字段。该解决方案结合使用clone()里面执行受保护的拷贝构造函数,基本上是这样的(例如,从引用的页面复制):使用新的关键字和复制构造函数代替super.clone的Java克隆()方法

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()获得”仅仅是一个约定。

那么,这个实现实际上是不正确的?为什么?

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

感谢,切赫

2013-04-03

Posa

+0

我不明白为什么不简单地使用“新人(this.brain,this.age)”(如果属性是最终的)或“新人(this.brain.clone(),this.age)在其他case –

+0

clone()'已经足够的了,你应该只是在任何地方使用拷贝构造函数,并且完全停止编写'clone'方法 –

+0

我从来没有理解过为什么你需要它们,你需要在C++中拷贝构造函数,因为编译器生成调用有时甚至需要自己编写它们,最终这是因为默认的C++参数语义是object-by的值,但在近16年的Java中,我从未使用clone()或copy构造函数任何严肃的代码 –

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于Java中的构造函数,我们不能像普通方法一样直接使用Clone方法进行克隆,因为构造函数是在创建对象时自动调用的。但是,我们可以使用Javassist库来实现静态构造函数克隆Javassist是一个用于在运行时修改字节码的Java库。我们可以使用Javassist创建一个的类,并将原始类的所有方法和字段复制类中。然后,我们可以在类中修改构造函数的实现,以实现克隆。 以下是一个示例代码,演示如何使用Javassist创建静态构造函数克隆: ``` import javassist.*; public class ConstructorClone { public static void main(String[] args) throws Exception { ClassPool pool = ClassPool.getDefault(); CtClass origClass = pool.get("com.example.OriginalClass"); CtClass newClass = pool.makeClass("com.example.NewClass"); // Copy all fields and methods from original class to new class newClass.setSuperclass(origClass); CtField[] fields = origClass.getDeclaredFields(); for (CtField field : fields) { newClass.addField(field); } CtMethod[] methods = origClass.getDeclaredMethods(); for (CtMethod method : methods) { newClass.addMethod(method); } // Clone constructor CtConstructor origConstructor = origClass.getDeclaredConstructor(new CtClass[]{}); CtConstructor newConstructor = CtNewConstructor.copy(origConstructor, newClass, null); newClass.addConstructor(newConstructor); // Modify constructor implementation newConstructor.setBody("{ super(); }"); // Create instance of new class Object newObject = newClass.toClass().newInstance(); } } ``` 在上面的代码中,我们首先获取了原始类的CtClass对象,并创建了一个的CtClass对象。然后,我们将原始类的所有字段和方法复制类中。接下来,我们使用CtNewConstructor.copy方法克隆原始类的构造函数,并将其添加到类中。最后,我们修改构造函数的实现,以调用原始构造函数并执行其他操作。 请注意,这只是一个示例代码,实际应用中可能需要更复杂的处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值