(State
)のディープコピーを作成してその中のインスタンスの1つに変更を加えようとしていて、新しいState
に基づいて古いState
を変更するコードをフォローアップします。ここでプリミティブ型のJavaクローンクラス
が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
を変更します。
ヒントをいただければ幸いです。ありがとう!
編集 - 好奇心、誰のために、ここでそれを修正するものです。
@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