7

Java でクラスを複製可能にするには、Cloneableインターフェースを実装する必要があります。このインターフェースを実装するということは、このクラスがクローン作成をサポートしていると言うことです。

しかし、Java 言語設計者が各クラスのデフォルト機能として「複製可能」を作成しない理由は何ですか?

浅いコピーのデフォルトの実装が既に存在します。では、なぜこの制限があるのでしょうか?

4

4 に答える 4

5

ネストされたプロパティを持つオブジェクトのクローンを作成することを検討してください。再帰的にどのくらい深く行きたいですか?これはメモリにとって難しいかもしれないので、開発者は私たちが決めるためにそれを残しました。

于 2012-12-02T15:50:03.757 に答える
4

これは、実装クラスが意図的にクローン作成用に設計されていることをJavaに通知するためのマーカーインターフェイスです(他のマーカーインターフェイスと同様の使用法)。さらに読むと、以下が見つかります。

慣例により、このインターフェースを実装するクラスは、パブリックメソッドでObject.clone(保護されている)をオーバーライドする必要があります。このメソッドのオーバーライドの詳細については、Object.clone()を参照してください。

クローン作成のためのカスタムメソッドを提供する必要があります。インターフェイスを使用することによりCloneable、Javaは、オブジェクトのクローン作成を意図的にサポートしていることを認識します。カスタムcloneメソッドを提供することにより、オブジェクトのデフォルトメソッドを上書きしcloneます。

このようにして、複製できるオブジェクトと複製できないオブジェクトを決定(マーク)する柔軟性が得られます。クローン可能であれば、どのレベルまで(オブジェクトグラフの場合に非常に役立ちます)。

于 2012-12-02T15:49:03.843 に答える
0

多くの理由が邪魔になっていますが、主な理由は、シリアル化のように、クローン作成は一般的なケースでは解決可能な問題ではないということです。

デフォルトで取得する浅いコピーは、多くの場合、オブジェクトの不変条件を破壊するため、一般的なデフォルトのクローン作成メカニズムとしては見えません。

于 2012-12-02T15:48:40.263 に答える
0

「Cloneable」インターフェースは、「MarkerClass」と呼ばれるデザインパターンの一部です。基本的に、cloneメソッド内には、「Cloneable」タイプへの参照が含まれます。クローン可能インターフェイスを実装すると、クラスを「Cloneable」タイプとして参照できるようになります。

もう1つの理由は、実際には、「clone()」メソッドをオーバーライドして、独自の方法でクローンを作成することです。つまり、重要と思われるデータが新しいクラスに存在するということです。

于 2012-12-02T15:50:31.623 に答える