我已经阅读过这个主题: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
答案 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;
}