【问题标题】:Creating a deep copy method, Java创建深拷贝方法,Java
【发布时间】:2011-04-26 10:43:50
【问题描述】:

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

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

【问题讨论】:

    标签: java arrays object clone deep-copy


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      return new GhostList(this);
      

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

      jadeed.ghosts = data;
      

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

      【讨论】:

        【解决方案3】:

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

        jadeed.foo = data;
        

        在您返回jadeed之前。

        【讨论】:

          【解决方案4】:

          如果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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-10-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-10-14
            • 2011-06-27
            • 1970-01-01
            • 2011-04-08
            相关资源
            最近更新 更多