我正在尝试创建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
中的board
与s
一起被修改,即使它未被通过......这是怎么回事?是不是应该调用所有原始类型的temp
克隆实例,以便可以对它们进行唯一修改?
这篇文章建议:http://howtodoinjava.com/core-java/cloning/a-guide-to-object-cloning-in-java/
我很难理解为什么这不会被深层复制,以及为什么我对.clone()
的修改也会修改temp
。
任何提示都将不胜感激 - 谢谢!
编辑 - 对于任何好奇的人来说,这是修正它的原因:
s
答案 0 :(得分:3)
super.clone()
不执行深层复制,int[][]
不是原始类型。
适用于int player
,因为这是一种原始类型,一个简单的副本(由Object#clone
完成)就足够了。
您需要(深度)自己复制int[][]
。
答案 1 :(得分:0)
深入克隆原始数据类型。您也可以使用序列化实现深度克隆