Javaでは基本データ型とString以外のオブジェクトはすべて参照渡しされるため、あるオブジェクトのインスタンスが複数のオブジェクトで参照されている場合、予想しないところで参照オブジェクトの書き換わりが発生し、バグが発生する可能性があります。
Cloneableインターフェースを実装することで利用できるCloneメソッドもオブジェクトは参照渡しされるためいわゆる「浅いコピー(shallow copy)」になり、予期せぬ副作用が発生する場合があります。
以下のテストケースはValueクラスのオブジェクトの値が書き換えられることで、参照を持っているインスタンスの値まで書き換わってしまう例です。
このような現象を発生させないためにはインスタンスの値を変更するときに、渡されたオブジェクトのコピーを設定することです。
先ほどのクラスを副作用がないように書き換えた場合、以下のようになります。
参考図書
Effective Java 第2版 (The Java Series)
- 作者: Joshua Bloch,柴田芳樹
- 出版社/メーカー: ピアソンエデュケーション
- 発売日: 2008/11/27
- メディア: 単行本(ソフトカバー)
- 購入: 77人 クリック: 936回
- この商品を含むブログ (267件) を見る