java中副本的意思,Java中的多态副本

该博客讨论了在Java中实现深度复制的问题,对比了使用Clonable接口和自定义复制方法的区别。作者提出了一种使用反射来创建深拷贝的方案,并对其可行性进行了分析,同时展示了代码示例。文章探讨了这种方法是否可接受以及是否存在更好的替代方案。
摘要由CSDN通过智能技术生成

我突然遇到了在

Java中制作深度多态副本的问题.实现Clonable解决了我的问题,但它通常被称为“坏”技术.

所以,我试图找到一个“不可克隆”的解决方案:

public class Parent {

int x;

public Parent() {}

public Parent(int x0) {

x = x0;

}

public Parent copy() {

Parent b = new Parent();

b.assign(this);

return b;

}

protected void assign(Parent c) {

x = c.x;

}

@Override

public String toString() {

return getClass().getName() + ", " + x;

}

}

public class Child extends Parent {

int y;

protected Child() {}

public Child(int x0, int y0) {

super(x0);

y = y0;

}

@Override

public Child copy() {

Child b = new Child();

b.assign(this);

return b;

}

@Override

protected void assign(Child c) {

super.assign(c);

y = c.y;

}

@Override

public String toString() {

return getClass().getName() + ", " + x + "," + y;

}

}

public class Test {

public static void main(String[] args) {

Parent x = new Parent(5);

Child y = new Child(10, 20);

Parent z = x.copy();

Parent w = y.copy();

System.out.println(x);

System.out.println(y);

System.out.println(z);

System.out.println(w);

}

}

输出是:

com.xxx.zzz.Parent, 5

com.xxx.zzz.Child, 10,20

com.xxx.zzz.Parent, 5

com.xxx.zzz.Child, 10,20

另一种(更短的)做同样的方法(使用Reflection):

public class Parent {

int x;

public Parent() {}

public Parent(int x0) {

x = x0;

}

public Parent copy() {

try {

Parent b = getClass().newInstance();

b.assign(this);

return b;

} catch (InstantiationException | IllegalAccessException e) {

e.printStackTrace();

return null;

}

}

protected void assign(Parent c) {

x = c.x;

}

@Override

public String toString() {

return getClass().getName() + ", " + x;

}

}

public class Child extends Parent {

int y;

protected Child() {}

public Child(int x0, int y0) {

super(x0);

y = y0;

}

protected void assign(Child c) {

super.assign(c);

y = c.y;

}

@Override

public String toString() {

return getClass().getName() + ", " + x + "," + y;

}

}

不需要覆盖Child类中的copy().但我不确定使用getClass().newInstance()来构造一个复制占位符是多么“合法”……

上述解决方案是值得使用还是有更常见/强大/简单的方法?

谢谢 !

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值