java 对象的副本_java – 对象数组的深层副本

我想使用构造函数制作对象数组的深层副本.

public class PositionList {

private Position[] data = new Position[0];

public PositionList(PositionList other, boolean deepCopy) {

if (deepCopy){

size=other.getSize();

data=new Position[other.data.length];

for (int i=0;i

data[i]=other.data[i];

}

但是,由于某种原因,我上面所说的不起作用.我有运行的自动化测试,并且它没有通过这些测试.所以这里有一个错误,我不确定它是什么.

解决方法:

你实现的是浅拷贝.要实现深层复制,您必须

更改

data[i] = other.data[i];

某些东西将other.data [i]的副本分配给data [i].如何执行此操作取决于Position类.可能的选择是:

>复制构造函数:

data [i] = new Position(other.data [i]);

>工厂方法:

data [i] = createPosition(other.data [i]);

>克隆:

data [i] =(Position)other.data [i] .clone();

笔记:

>以上假设复制构造函数,工厂方法和克隆方法分别实现“正确”的复制类型,具体取决于Position类;见下文.

>克隆方法仅在Position明确支持时才有效,这通常被视为劣质解决方案.此外,您需要注意克隆的本机实现(即Object.clone()方法)执行浅拷贝.

事实上,在Java中实现深度复制的一般问题很复杂.在Position类的情况下,可以假设属性都是基本类型(例如,int或double),因此深度与浅度复制是没有实际意义的.但是,如果存在引用属性,则必须依赖复制构造函数/工厂方法/克隆方法来执行所需的复制.在每种情况下都需要编程.在一般情况下(你必须处理循环)很难并且要求每个类实现特殊方法.

还有另一种可能的方法来复制对象数组.如果数组中的对象是可序列化的,则可以使用ObjectOutputStream和ObjectInputStream序列化复制它们,然后对阵列进行反序列化.然而:

>这很贵,

>它仅在对象(可传递)可序列化时才有效

>不会复制任何瞬态字段的值.

建议不要通过序列化进行复制.支持克隆或其他方法会更好.

总而言之,Java中最好避免深度复制.

最后,要回答关于Position类复制构造函数的问题,我希望它是这样的:

public class Position {

private int x;

private int y;

...

public Position(Position other) {

this.x = other.x;

this.y = other.y;

}

...

}

正如@Turtle所说,没有任何魔法.您实现一个构造函数(手动),通过从现有实例复制来初始化其状态.

标签:java,arrays,constructor,object,copy

来源: https://codeday.me/bug/20190918/1810958.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值