※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

Javaでのコピー(Javaの落とし穴)


投稿者: M.K
日付: 2007-09-26 23:58

下記Gさんの過去メールを抜粋



新緑の萌ゆる季節なゴールデンウィーク。
皆様、如何お過ごしでしょうか。

お疲れ様です、Gです。
小職、GW全部出勤でかなーりブルーなわけですが。


まぁ、それはそれとして、掲題の件なのですが
経緯としては最近、新人さんに教える機会が増えました。
新人さんは色々と興味深い話題を提供してくれますので、
話題に困りません。

今回はその1つでございます。


ネタとしては、「=」は必ずしも値のコピーとはなりえない。
という話題でございます。以下はJavaソース。
その1では数値に対して「=」を行った場合の動作。
その2では日付オブジェクトに対して「=」を行った場合の動作。
その3では配列に対して「=」を行った場合の動作です。

  • その1では「=」でつないだ後、変数bの値を変更しても変数aの値は保持されます。

  • その2、その3ではdTest1、array1の値を変更していないにも関わらず、
dTest2、array2の値を変更した際に値が勝手に書き換わっている事が分かります、はい。


じゃぁ、どうすればできるんだという人のためにdTest3、array3を一例として示しておきます。
Javaプログラマがよくぶち当たる落とし穴でした。
不具合埋め込まないように気をつけましょう・・・プログラムってメンドクセ('Д`)


ご不明な点、間違ってるとこなどありましたら解説、土下座しますので
Gまでどうぞ。


●下記Javaソースの実行結果
a:1
b:2
1回目dTest1:Tue Apr 24 10:02:05 JST 2007
1回目dTest2:Tue Apr 24 10:02:05 JST 2007
1回目dTest3:Tue Apr 24 10:02:05 JST 2007
2回目dTest1:Fri Apr 24 10:02:05 JST 3007
2回目dTest2:Fri Apr 24 10:02:05 JST 3007
2回目dTest3:Tue Apr 24 10:02:05 JST 4007
1回目array1:リンゴ:みかん:いも
1回目array2:リンゴ:みかん:いも
1回目array3:リンゴ:みかん:いも
2回目array1:トラ:ライオン:トナカイ
2回目array2:トラ:ライオン:トナカイ
2回目array3:ばば:いのき:えのき


●以下ソース

int a = 1;
int b = a;

b = 2;

System.out.println("a:" + a);
System.out.println("b:" + b);

java.util.Date dTest1 = new java.util.Date();
java.util.Date dTest2;
java.util.Date dTest3;

dTest2 = dTest1;
dTest3 = (Date) dTest1.clone();

System.out.println("1回目dTest1:" + dTest1);
System.out.println("1回目dTest2:" + dTest2);
System.out.println("1回目dTest3:" + dTest3);

dTest2.setYear(1107);
dTest3.setYear(2107);

System.out.println("2回目dTest1:" + dTest1);
System.out.println("2回目dTest2:" + dTest2);
System.out.println("2回目dTest3:" + dTest3);

String[] array1 = {"リンゴ", "みかん\", "いも\"};
String[] array2;
String[] array3 = {"", "", ""};

array2 = array1;
System.arraycopy(array1, 0, array3, 0, 3);

System.out.println("1回目array1:" + array1[0] + ":" + array1[1] + ":" + array1[2]);
System.out.println("1回目array2:" + array2[0] + ":" + array2[1] + ":" + array2[2]);
System.out.println("1回目array3:" + array3[0] + ":" + array3[1] + ":" + array3[2]);

array2[0] = "トラ\";
array2[1] = "ライオン\";
array2[2] = "トナカイ";

array3[0] = "ばば";
array3[1] = "いのき";
array3[2] = "えのき";

System.out.println("2回目array1:" + array1[0] + ":" + array1[1] + ":" + array1[2]);
System.out.println("2回目array2:" + array2[0] + ":" + array2[1] + ":" + array2[2]);
System.out.println("2回目array3:" + array3[0] + ":" + array3[1] + ":" + array3[2]);