myfinderの技術や周辺的活動のblog

2008年11月29日土曜日

オブジェクトのコピーその2

オブジェクトをコピーするときはその「深さ」についてちゃんと考えないといかんようで、その顕著な例として、多次元配列がわかりやすそう。

今回は2次元配列で

int[][] arr = {
{1,2,3,4},
{5,6,7,8},
{9,10,11,12}
};

int[][] copy = arr.clone();

という感じでオブジェクトをコピーすると、配列の外側だけがコピーされて、内側の配列への参照は同じものになる。

元データと、その変化シミュレーションみたいな表示をやりたいときにcloneを使ってしまうと、コピー後のオブジェクトの内側配列に対する操作がコピー前のオブジェクトの内側配列にも反映される。
同じものを参照しているから当然と言えば当然なんだけど、このへん忘れてcloneして喜んでしまいそうなので注意したい。

2次元配列をコピーするときは、多分こうするのがいいと思う。

int[][] arr = {
{1,2,3,4},
{5,6,7,8},
{9,10,11,12}
};

int[][] copy = new int[arr.length][]; // とりあえず外側の配列の数合わせて宣言。
for (int i : arr) {
copy[i] = arr[i].clone(); // 改めて内側の配列をコピー
}

という感じで書いておけば、コピー元とコピー先で違うものになるので、妙な挙動はなくなる。

同じオブジェクトを共有したいのか、別々に取り扱いたいのかをはっきりさせるのが大事ってことかなと。

0 件のコメント: