我想制作一个深层复制方法。前几天我在这个问题上寻求帮助,但那是一个复制构造函数。现在我需要一个常规方法。我创建了代码(非工作),但我只是不完全理解它。
public GhostList deepCopy(){
int length=this.getLength();
GhostList jadeed=new GhostList();
Ghost[] data = new Ghost[length];
for (int i=0;i<this.getLength();i++){
data[i] = new Ghost();
data[i].setX(this.ghosts[i].getX());
data[i].setY(this.ghosts[i].getY());
data[i].setColor(this.ghosts[i].getColor());
data[i].setDirection(this.ghosts[i].getDirection());
}
return jadeed;
}
现在,当我创建一个名为jadeed的新GhostList,然后在其下创建一个新的ghost数据数组时,它是否知道数据属于jadeed GhostList?我不知道这两者是如何联系起来的,即使它们应该如此。
另外,我没有足够的时间来匹配副本和this.object。我的问题是什么?
答案 0 :(得分:3)
您创建了一个新的GhostList
和一个新的Ghost
数组
您填写Ghost
数组并返回GhostList
,但返回的GhostList
与Ghost
数组无关。
您应该将所有新鬼添加到GhostList
答案 1 :(得分:2)
首先,您提到了一个复制构造函数。如果您已经开始工作,那么您在deepCopy
方法中所需要做的就是:
return new GhostList(this);
让我们忘记现在,回到你发布的代码。您正在创建一个名为data
的数组,但您从未在任何地方使用它。您不应该将此数组分配给jadeed
吗?类似的东西:
jadeed.ghosts = data;
最后,不要调用方法deepCopy
,最好将其称为clone
并实现Cloneable
接口。这样做可以让每个人都知道如何使用标准界面获取对象的副本。
答案 2 :(得分:1)
您的GhostList
类将作为其数据成员对Ghost
数组的引用。您没有向我们展示类定义,因此我们假设该成员名为foo
。现在,您需要做的就是使新创建的foo
对象的jadeed
引用引用您已创建并填充的Ghost
数组。你可以这样做:
jadeed.foo = data;
返回jadeed
之前。
答案 3 :(得分:0)
如果GhostList
及其组成的所有内容都是Serializable
,则可以将GhostList
实例序列化为字节数组并重新读取。这是几行代码,除非你使用` Jakarta Commons Lang - 一行代码: