Я пытаюсь создать глубокую копию файла Object
(называемый State
), чтобы внести изменения в один из экземпляров внутри него, а затем выполнить код, который изменяет старый State
на основе нового State
,Класс Java Clone с примитивными типами
Вот 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
, хотя он не передан ... Как получилось? Должен ли вызов .clone()
клонировать экземпляры всех примитивных типов, чтобы они могли быть однозначно изменены?
Вот что этот пост предполагает: http://howtodoinjava.com/core-java/cloning/a-guide-to-object-cloning-in-java/
Я изо всех сил, чтобы понять, почему это не было бы глубоко скопирована, и почему мои модификации temp
также модифицировать s
.
Любые советы были бы весьма признательны - спасибо!
Edit - Для тех, кто любопытным, вот что установил его:
@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;
}
Это сработало, спасибо вам большое! – midwestcode