Java でクラスを複製可能にするには、Cloneable
インターフェースを実装する必要があります。このインターフェースを実装するということは、このクラスがクローン作成をサポートしていると言うことです。
しかし、Java 言語設計者が各クラスのデフォルト機能として「複製可能」を作成しない理由は何ですか?
浅いコピーのデフォルトの実装が既に存在します。では、なぜこの制限があるのでしょうか?
ネストされたプロパティを持つオブジェクトのクローンを作成することを検討してください。再帰的にどのくらい深く行きたいですか?これはメモリにとって難しいかもしれないので、開発者は私たちが決めるためにそれを残しました。
これは、実装クラスが意図的にクローン作成用に設計されていることをJavaに通知するためのマーカーインターフェイスです(他のマーカーインターフェイスと同様の使用法)。さらに読むと、以下が見つかります。
慣例により、このインターフェースを実装するクラスは、パブリックメソッドでObject.clone(保護されている)をオーバーライドする必要があります。このメソッドのオーバーライドの詳細については、Object.clone()を参照してください。
クローン作成のためのカスタムメソッドを提供する必要があります。インターフェイスを使用することによりCloneable
、Javaは、オブジェクトのクローン作成を意図的にサポートしていることを認識します。カスタムclone
メソッドを提供することにより、オブジェクトのデフォルトメソッドを上書きしclone
ます。
このようにして、複製できるオブジェクトと複製できないオブジェクトを決定(マーク)する柔軟性が得られます。クローン可能であれば、どのレベルまで(オブジェクトグラフの場合に非常に役立ちます)。
多くの理由が邪魔になっていますが、主な理由は、シリアル化のように、クローン作成は一般的なケースでは解決可能な問題ではないということです。
デフォルトで取得する浅いコピーは、多くの場合、オブジェクトの不変条件を破壊するため、一般的なデフォルトのクローン作成メカニズムとしては見えません。
「Cloneable」インターフェースは、「MarkerClass」と呼ばれるデザインパターンの一部です。基本的に、cloneメソッド内には、「Cloneable」タイプへの参照が含まれます。クローン可能インターフェイスを実装すると、クラスを「Cloneable」タイプとして参照できるようになります。
もう1つの理由は、実際には、「clone()」メソッドをオーバーライドして、独自の方法でクローンを作成することです。つまり、重要と思われるデータが新しいクラスに存在するということです。