2016-10-05 17 views
0

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の後に何らかの理由でboardsにあると、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; 
} 

答えて

3

super.clone()は深いコピーをしない、とint[][]はプリミティブ型ではありません。

これはプリミティブタイプであり、単純なコピー(Object#cloneのように)で十分であるため、int playerで動作します。

あなた自身(int[][])をコピーする必要があります。

+0

それはうまくいきました、ありがとう! – midwestcode

0

プリミティブデータ型のディープクローン。あなたはシリアライゼーションを使って深いクローニングを達成することもできます

関連する問題