创建深层复制方法,Java

时间:2010-10-16 22:11:36

标签: java arrays object clone deep-copy

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

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 个答案:

答案 0 :(得分:3)

您创建了一个新的GhostList和一个新的Ghost数组 您填写Ghost数组并返回GhostList,但返回的GhostListGhost数组无关。
您应该将所有新鬼添加到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 - 一行代码:

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