質問: Object.clone()は、shallowCopyということもあって、 ObjectAの持つObjectBは参照のコピーになるそうですが、 再帰的に値をコピーしたいときは、Clonableの継承先でオーバーライドしたclone()内で、 さらに子階層の変数をclone()しないといけないのでしょうか? だとすると、例ですが、 「「 ObjectAが持つ、ObjectB 」が持つObjectC 」が持つObjectD ※A, B, C, Dはそれぞれ別のクラス まで複製したいといった場合には、Reflectionで複製した方が利口なのでしょうか?
回答: > > 再帰的に値をコピーしたいときは、Clonableの継承先でオーバーライドしたclone()内で、 > > さらに子階層の変数をclone()しないといけないのでしょうか? > > > 仰る通りJavaの`Object#clone()`はSallow Copy(浅いコピー)ですから、入れ子になった子孫オブジェクトは複製されずコピー元/先オブジェクトから共有されます。 オブジェクトの中身を一番よく知っているのはそのクラス自身ですから、Java的なオブジェクト指向設計に従うと、対象クラス自身がDeep Copy(深いコピー)を行う独自メソッドを提供する方が自然だと思います。 ただし、対象クラスでそのようなDeep Copyメソッドが提供されない場合は、Relfection機能を使ってクラス外部から`clone()`メソッドを再帰的に呼び出すような複製処理が必要になります。 > > (前略)まで複製したいといった場合には、Reflectionで複製した方が利口なのでしょうか? > > > 本家SOの類似質問 How do you make a deep copy of an object in Java? では、シリアライズを利用する方法が紹介されていました。コピー元オブジェクトをシリアライズ(バイト列化)し、そこからデシリアライズすることでDeep Copyされた別オブジェクトを生成できます。