我想使用构造函数制作对象数组的深层副本.
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