首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java中的对象克隆():为什么这个断言失败?

Java中的对象克隆():为什么这个断言失败?
EN

Stack Overflow用户
提问于 2013-12-22 21:27:33
回答 3查看 147关注 0票数 0

据我所知,object clone()创建了克隆对象的新副本。在我的例子中,我试图克隆Symbol的矩阵(这是一个简单的enum)。this.table是原始对象,而t是克隆。当我将一个新值写入t单元格时,我希望this.table保持不变。然而,情况并非如此,第二个 assert失败了。(我添加了第一个断言,只是为了确保第二个断言的正确性)。

以下是代码:

代码语言:javascript
运行
复制
@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。那我就很困惑了。有人能解释一下发生了什么吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-12-22 21:38:25

您有一个Symbol实例数组数组。

当您在clone()上调用this.table时,您将得到一个新的数组t,但是t中的每个数组都与this.table中的数组相同。

为了检查这一点,您可以尝试assert t[0] == this.table[0];

为了获得更深层次的克隆,您必须创建一个新数组并自己初始化它:

代码语言:javascript
运行
复制
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];
    }
}
票数 2
EN

Stack Overflow用户

发布于 2013-12-22 21:31:58

我只是在这里猜测,但是==和.equals()之间有一个区别,每个人都会使用==和一些实际需要.equal的对象引用进行一次或两次的刻录。试试看..。

代码语言:javascript
运行
复制
assert this.table[((TickAction)action).x][((TickAction)action).y].equals( currentPlayer.getSymbol() );
票数 1
EN

Stack Overflow用户

发布于 2013-12-22 21:34:21

你不能像现在这样使用克隆,如果你没有自己实现它,它不会对你有帮助。等号(字符串除外)相同

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20734220

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档