gpt4 book ai didi

java - Java中的对象克隆() : why does this assertion fail?

转载 作者:行者123 更新时间:2023-12-01 18:38:52 25 4
gpt4 key购买 nike

据我所知,对象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;
}

注意:通过调试器,我检查了 tthis.table 实际上具有不同的 id,但是在第二次检查后我注意到,尽管如此,它们的单个单元具有相同的id。然后我对此很困惑。有人可以解释一下发生了什么吗?

最佳答案

您有一个 Symbol 实例数组。

当您对 this.table 调用 clone() 时,您会得到一个新数组 t,但是 tthis.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];
}
}

关于java - Java中的对象克隆() : why does this assertion fail?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20734220/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com