在Java对象中克隆属性相同的对象

时间:2015-11-03 18:26:57

标签: java cloning

我已经阅读过这个主题:http://howtodoinjava.com/2012/11/08/a-guide-to-object-cloning-in-java/

我做了一些测试,但它确实有效。现在,我的问题是克隆一个对象A,它获得了其他对象A的列表。例如:

        public class Cell {
            Cell[] listOfCells;
        }

我在 Cell

类中尝试了以下代码
        public Object clone() throws CloneNotSupportedException {
            Cell cloned = (Cell) super.clone();

            /* Cloning the list.
             * For example, trying to clone the first cell of the list.
             */
            Cell[] clonedList = new Cell[listOfCells.length];
            clonedList[0] = (Cell) listOfCells[0].clone();
        }

问题是,当在该列表上调用方法时,每个单元格将再次调用该方法等,然后,stackoverflow。

编辑:@PaulBoddington是的,我正在尝试进行深层复制。是的, listOfCells 将包含(间接)。为了简化它,每个单元格都有一些邻居(它们是单元格),我已经用列表表示了它们。我想要达到的目的是:克隆细胞并通过修饰这个克隆,它不会影响原始细胞。例如:

    Cell original;
    Cell cloned = original.clone();

    cloned.die();
    cloned.listOfCells[0].die(); // the first neighbor of the clone

    cloned.showState(); // display dead
    cloned.listOfCells[0].showState; // display dead

    original.showState(); // display alive
    original.listOfCells[0].showState(); // the first neighbor of the original, must be alive

2 个答案:

答案 0 :(得分:1)

我会避免Delete。人们普遍认为clone被破坏了(参见Joshua Bloch的有效Java,或者搜索这个网站)。相反,你可以编写自己的方法。

我写了一个我觉得有用的方法clone。它使用deepCopy来查找以前遇到IdentityHashMap的时间,以避免多次计算其副本。

请注意,此方法仍然是递归的,因此无论如何您都会遇到非常非常大的结构Cell,但对于可以直接或间接包含自身的对象,则无法做到没有使用这样的东西。

StackOverflowError

答案 1 :(得分:0)

在你的clone()方法中替换

 clonedList[0] = (Cell) listOfCells[0].clone();

for (int i = 0; i < listOfCells.length; i++) {
   Cell clone = this;
   if (listOfCells[i] != this) { // avoid endless loop in case of self reference
      clone = (Cell) listOfCells[i].clone();
   }
   clonedList[i] = clone;
}