Ich versuche eine tiefe Kopie von Object
(genannt State
) zu erstellen, um Änderungen an einer der darin enthaltenen Instanzen vorzunehmen, gefolgt von Code, der die alte State
basierend auf der neuen State
modifiziert .Java-Klon-Klasse mit primitiven Typen
Hier ist 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();
}
}
Dann ist hier, wie ich versuche, und greifen Sie:
State temp = (State) s.clone();
Action act = determineAction(temp);
doSomething(s, act);
s
ist ein State
in die Methode übergeben. Nachdem determineAction
aufgerufen wird, wird aus irgendeinem Grund die board
in s
zusammen mit temp
geändert, obwohl es nicht übergeben wird ... Wie kommt es? Sollte der Aufruf an .clone()
Instanzen aller primitiven Typen nicht so klonen, dass sie eindeutig geändert werden können?
Das ist, was dieser Beitrag schon sagt: http://howtodoinjava.com/core-java/cloning/a-guide-to-object-cloning-in-java/
Ich bin zu kämpfen, um zu sehen, warum dies nicht tief kopiert werden würde, und warum meine Änderungen an temp
würden auch s
ändern.
Alle Tipps würden sehr geschätzt werden - danke!
Bearbeiten - Für alle neugierig, hier ist was es fest:
eine tief Kopie ist@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;
}
Das hat funktioniert, vielen Dank! – midwestcode