据我所知,object clone()创建了克隆对象的新副本。在我的例子中,我试图克隆Symbol的矩阵(这是一个简单的enum)。this.table是原始对象,而t是克隆。当我将一个新值写入t单元格时,我希望this.table保持不变。然而,情况并非如此,第二个 assert失败了。(我添加了第一个断言,只是为了确保第二个断言的正确性)。
以下是代码:
@Override
public State applyAction(Action action) {
int x = ((TickAction)action).x;
int y = ((TickAction)action).y;
Symbol[][] t = this.table.clone();
assert this.table[x][y] != currentPlayer.getSymbol();
t[x][y] = currentPlayer.getSymbol();
assert t[x][y] != this.table[x][y] ;
TableState ts = new TableState(t,this.currentPlayer.getNextPlayer());
ts.setLastAction(action);
return ts;
}注意:使用调试器,我检查了t和this.table实际上有不同的id,但是经过第二次检查,我注意到,尽管如此,它们的单个单元格具有相同的id。那我就很困惑了。有人能解释一下发生了什么吗?
发布于 2013-12-22 21:38:25
您有一个Symbol实例数组数组。
当您在clone()上调用this.table时,您将得到一个新的数组t,但是t中的每个数组都与this.table中的数组相同。
为了检查这一点,您可以尝试assert t[0] == this.table[0];。
为了获得更深层次的克隆,您必须创建一个新数组并自己初始化它:
Symbol[][] t = new Symbol[][this.table.length];
for (int i = 0; i < t.length; i++)
{
t[i] = new Symbol[this.table[i].length];
for (int j = 0; j < t[i].length; j++)
{
// Here I am sharing the Symbol objects between the two arrays.
// If you do not want that, define your own way to copy or clone the object.
t[i][j] = this.table[i][j];
}
}发布于 2013-12-22 21:31:58
我只是在这里猜测,但是==和.equals()之间有一个区别,每个人都会使用==和一些实际需要.equal的对象引用进行一次或两次的刻录。试试看..。
assert this.table[((TickAction)action).x][((TickAction)action).y].equals( currentPlayer.getSymbol() );发布于 2013-12-22 21:34:21
你不能像现在这样使用克隆,如果你没有自己实现它,它不会对你有帮助。等号(字符串除外)相同
https://stackoverflow.com/questions/20734220
复制相似问题