具有原始类型的 Java 克隆类

标签 java clone

我正在尝试创建一个 Object 的深拷贝(称为 State),以对其中的一个实例进行修改,然后使用修改的代码旧的State基于新的State

这是状态:

public class State implements Cloneable {

    // 0: empty
    // 1: white
    // 2: black
    private int[][] board;

    private int player;

    public State(int[][] board, int player) {
        this.board = board;
        this.player = player;
    }

    public int[][] getBoard() {
        return board;
    }

    public int getPlayer() {
        return player;
    }

    public void setBoard(int[][] board) {
        this.board = board;
    }

    public void setPlayer(int player) {
        this.player = player;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }

}

然后,这是我尝试访问它的方法:

State temp = (State) s.clone();
Action act = determineAction(temp);
doSomething(s, act);

s 是传递到方法中的State。调用确定操作后,由于某种原因,s 中的 boardtemp 一起被修改,即使它是没通过……怎么会这样?难道不应该调用 .clone() 克隆所有原始类型的实例,以便可以唯一地修改它们吗?

这就是这篇文章的建议:http://howtodoinjava.com/core-java/cloning/a-guide-to-object-cloning-in-java/

我很难理解为什么这不会被深度复制,以及为什么我对 temp 的修改也会修改 s

任何提示将不胜感激 - 谢谢!

编辑 - 对于任何好奇的人,以下是修复它的方法:

@Override
protected Object clone() throws CloneNotSupportedException {

    State cloned = (State) super.clone();

    int[][] clonedBoard = new int[8][8];

    for (int i = 0; i < 8; i++) {
        for (int j = 0; j < 8; j++) {
            clonedBoard[i][j] = board[i][j];
        }
    }

    cloned.setBoard(clonedBoard);

    return cloned;
}

最佳答案

super.clone() 不执行深层复制,并且 int[][] 不是原始类型。

它适用于 int 播放器,因为这是一个原始类型,一个简单的副本(由 Object#clone 完成)就足够了。

您需要自己(深度)复制您的int[][]

关于具有原始类型的 Java 克隆类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39864347/

相关文章:

javascript - jQuery 克隆改变的内容

jquery - 在 DOM 外部使用 jQuery 克隆

jquery - 如何在clone()操作期间删除选定的元素

2011年的java web框架

java - Gradle 项目同步失败 - Android Studio Gradle Build 2.20

java - 如何在 iTextPDF 中对齐图形?

java - GAE 实例是否限制为 10 个并发请求?

jquery - 如何使用 jQuery 克隆、修改和添加元素?

jquery - .clone() 影响实际的 HTML 而不是副本

java - 在jsp中写出表格时计算总数