1

我想做一个深拷贝方法。前几天我在这里寻求帮助解决这个问题,但那是针对复制构造函数的。现在我需要一个常规的方法。我创建了代码(非工作),但我只是不完全理解它。

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 相匹配的长度。我的问题是什么?

4

4 回答 4

3

您创建了一个新的GhostList和一个新的Ghost数组。
您填写Ghost数组并返回GhostList但返回的GhostList与数组无关Ghost
您应该将所有新幽灵添加到GhostList

于 2010-10-16T22:16:10.547 回答
2

首先,您提到了复制构造函数。如果你已经有了这个工作,那么你需要在你的deepCopy方法中做的就是:

return new GhostList(this);

让我们暂时忘记这一点,回到您发布的代码。data您正在创建一个名为但您从未在任何地方使用过的数组。您不应该将此数组分配给jadeed吗?就像是:

jadeed.ghosts = data;

最后,与其调用方法deepCopy,不如调用它clone并实现Cloneable接口。这样做可以让每个人都知道如何使用标准接口获取对象的副本。

于 2010-10-16T22:19:48.403 回答
1

您的GhostList类将具有对数组的引用作为其数据成员Ghost。您没有向我们展示类定义,因此假设该成员名为foo。现在您需要做的就是让foo新创建的对象的引用指向您创建和填充jadeed的数组。Ghost你可以这样做:

jadeed.foo = data;

在你回来之前jadeed

于 2010-10-16T22:24:35.880 回答
0

如果GhostList它所包含的所有内容都是Serializable,您可以将实例序列GhostList化为字节数组并重新读取它。这是几行代码,除非你使用 ` Jakarta Commons Lang - 一行代码:

http://commons.apache.org/lang/api-2.5/org/apache/commons/lang/SerializationUtils.html#clone%28java.io.Serializable%29

于 2010-10-16T23:52:15.307 回答