かまたま日記3

プログラミングメイン、たまに日常

副作用が発生しないクラスを作る

Javaでは基本データ型とString以外のオブジェクトはすべて参照渡しされるため、あるオブジェクトのインスタンス複数のオブジェクトで参照されている場合、予想しないところで参照オブジェクトの書き換わりが発生し、バグが発生する可能性があります。

Cloneableインターフェースを実装することで利用できるCloneメソッドもオブジェクトは参照渡しされるためいわゆる「浅いコピー(shallow copy)」になり、予期せぬ副作用が発生する場合があります。

以下のテストケースはValueクラスのオブジェクトの値が書き換えられることで、参照を持っているインスタンスの値まで書き換わってしまう例です。

このような現象を発生させないためにはインスタンスの値を変更するときに、渡されたオブジェクトのコピーを設定することです。
先ほどのクラスを副作用がないように書き換えた場合、以下のようになります。

参考図書

Effective Java 第2版 (The Java Series)

Effective Java 第2版 (The Java Series)