2012-04-03 13 views
-1

配列内のオブジェクトにいくつかの問題があります。例えばJavaクラスのコピーと配列

boardArray = new object[4]; 
workingBoardArray = new object[4]; 
boardArray[0] = new board(boardA); 
boardArray[1] = new board(boardB); 
boardArray[2] = new board(boardC); 
boardArray[3] = new board(boardD); 
int selectedBoard = selectBoard(boardArray); 
workingBoardArray[0] = boardArray[selectedBoard]; 
workingBoardArray[1] = boardArray[selectedBoard]; 
workingBoardArray[2] = boardArray[selectedBoard]; 
workingBoardArray[3] = boardArray[selectedBoard]; 
workingBoard[0].moveUp(); 
workingBoard[1].moveRight(); 
workingBoard[2].moveDown(); 
workingBoard[3].moveLeft(); 

このコードは、4枚のボードのセットを作成し、所望のボードを見つけ、作業板アレイにボードをコピーし、新しい方向に各作業ボードをシフトします。問題はボードがすべて一緒に行動することです。したがって、私がworkingBoard [0]でmoveUp()を実行すると、workingBoard [1]も上に移動します。これを回避する方法はありますか、私は基本的な理解や本当にばかげた間違いを逃しているような気がします。

私はまた、すべての重要なボード情報を取得し、それを新しいボードを作成し、それdoesntのは何も影響を与えているように見える

workingBoard[0] = new Board(boardArray[selectedBoard].getBoard); 

のようなコピーの建設業者を使用してみました。

int selectedBoard = selectBoard(boardArray); 
workingBoardArray[0] = boardArray[selectedBoard]; 
workingBoardArray[1] = boardArray[selectedBoard]; 
workingBoardArray[2] = boardArray[selectedBoard]; 
workingBoardArray[3] = boardArray[selectedBoard]; 

同じオブジェクトへの参照ようにすべての4つの配列要素を設定しています:すべてのヘルプは、このコードで素晴らしい

+3

あなたはボードクラスの実装を投稿していない限り手助けすることができませんでしを(それは確かに一つのクラス定義である場合)、あることを行っている場合インタフェースにキャストするには、少なくとも実行メソッドを持つオブジェクトを定義するクラスの1つを –

+0

に見せてください。また、boardA、boardBなどが作成されているコードを投稿してください。 –

+0

'workingBoardArray'と' workingBoard'は同じ?もしあなたが 'workingBoard'をどこで定義して初期化していないのであれば? – assylias

答えて

7

ルックだろう。したがって、moveUp()などを呼び出してそのオブジェクトを変更すると、に変更され、配列内のすべての要素から表示されます。

毎回ボードコピーを作成したいと思うようです。あなたのタイプ(名前付け規則に従うためにBoardと呼ぶべき)のタイプに応じて、Cloneable(おそらくclone()メソッドをオーバーライドする)を実装するか、または他の種類のコピー操作を提供することができます。

あなたは参照とJavaでオブジェクトの違いを認識している、との配列は参照のみではなく、オブジェクトが含まれていますか? (同様に、変数の値はオブジェクトではなく参照のみになります。)実際にははJavaでオブジェクトがどのように機能するかを理解するのに重要です。たとえば:

StringBuilder a = new StringBuilder(); 
StringBuilder b = a; 
a.append("Foo"); 
System.out.println(b); // Still prints "Foo" 

は、ここでは、その値が同じオブジェクトを参照する2つの変数(ab)があるにもかかわらず、 StringBuilderオブジェクトを持っています。

1

...そのボードを作業ボードアレイにコピーし、次に各作業ボードを新しい方向にシフトします。

実際にはボードをコピーしません。 workingBoardArrayから4回参照されるボードインスタンスは1つだけです。ボードのコピーを作成するには、クローン方式を実装するか、カスタムコピー方式を提供する必要があります。例えば

あなたが書くことができcloneメソッド実装した場合:

workingBoardArray[0] = boardArray[selectedBoard].clone();