具有原始类型的Java克隆类

时间:2016-10-05 02:02:33

标签: java clone

我正在尝试创建Object的深层副本(称为State)来对其中的一个实例进行修改,然后跟进修改旧{{1}的代码}基于新的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后,由于某种原因,determineAction中的boards一起被修改,即使它未被通过......这是怎么回事?是不是应该调用所有原始类型的temp克隆实例,以便可以对它们进行唯一修改?

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

我很难理解为什么这不会被深层复制,以及为什么我对.clone()的修改也会修改temp

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

编辑 - 对于任何好奇的人来说,这是修正它的原因:

s

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:0)

深入克隆原始数据类型。您也可以使用序列化实现深度克隆