CloneableインタフェースとObject.clone()
合コンフォローその2。Cloneableなクラスでメソッドclone()はオーバーライドすべきかという話題です。
ごめんなさい、ワタシ間違ってました。Object.clone()はshallowCopyだとはっきり書いてありました。
以下サンのJ2SDKドキュメント引用です。
まずCloneableインタフェースですが
従来、このインタフェースを実装するクラスは、public メソッドで Object.clone (protected) をオーバーライドする必要があります。 このメソッドのオーバーライドに関する詳細は、 Object.clone() を参照してください。
「従来」というのが何を意味するのか、今ひとつ不明なのですが、(英語版見ろよ>俺)
やはりclone()はオーバーライドしなさいということのようです。
次にObject.clone()ですが、
Object クラスの clone メソッドは、特定の複製処理を実行します。 まず、このオブジェクトのクラスが Cloneable インタフェースを 実装していない場合は、CloneNotSupportedException がスロー されます。配列はすべて、インタフェース Cloneable を実装して いるものと見なされることに注意してください。実装していない場合、 このメソッドはこのオブジェクトのクラスの新しいインスタンスを 生成し、そのフィールドをすべて、このオブジェクトの対応する 各フィールドの内容で初期化します。これは代入と同様で、フィールド の内容自身が複製されるのではありません。つまりこのメソッドは、 オブジェクトのシャローコピーを生成しますが、ディープコピーは 生成しません。
あ、しっかりシャローコピーと書いてある。一応デフォルトのclone()を使うことも(シャローコピーであることを考慮すれば)いけないことではなさそうです。
ただ、ワタシ的には「オブジェクトの複製方法はそのクラス自身が決めるべきである」と思いますのでCloneableなクラスではclone()を実装すべき、と考えています。