2013-05-02 19 views
8

私はJavaクローニングについてチュートリアルをオンラインで探していましたが、クローンの欠点()と利点については何も見つかりませんでした。私は、Javaクローン()を使用する利点のいくつかを知りたいと思います。Javaクローニングの利点

答えて

10

クローニングは確実にその用途を有する。オブジェクトとして表現されたデータの記録を持ち、 "名前を付けて保存"(複製および名前変更)できるビジネスアプリケーションのあらゆる種類を想像してください。そのデータがCloneableインタフェースを実装するオブジェクトに保持されている場合、元のデータを複製して新しい情報で更新できます。

これは、新しいオブジェクトインスタンスを作成し、すべてのデータを明示的にコピーするよりも優れています。コピーを行うヘルパークラスとメソッドを使ってこの問題に対処する人もいますが、クラス自体の外部にあるクラスをコピーするために必要な情報があります。

私が好きな別の使用例は、クラスをGUI用のバッキングストアとして使用し、そのGUIにリセットボタンがある場合です。 GUIが初期化されると、私はバッキングストアオブジェクトをクローンします。その後、ユーザーがリストアを押すと、変更された可能性のある情報を特定するのではなく、ストレージから元の情報の新しいコピーを取得するのではなく、GUIをクローンオブジェクトの値に再初期化するだけです。確かに多くの用途があります。

あなたが知っているように、継承フレームワークで問題が発生し、軽量データクラスが混乱する可能性があるので、ビジネス要件がない限り、オブジェクトを複製できません。

3

私はクローニングの利点について何かを見つけるのが難しい理由は暗黙の利点であると思います:元のオブジェクトの正確な複製を(おそらく)簡単な方法で作成することです。

残念ながら、clone()とCloneableを使ったJavaの組み込みのクローン作成メカニズムは、クラスの設計にとって恐ろしい意味を持つため、多くの欠点があります。 Josh Blochは、なぜ彼の本でクローン()またはCloneableを使用すべきではないかに関する全セクションを持っています有効なJavaは、interviewで簡潔にまとめられています。

一般的には、clone()またはCloneableを使用する代わりにコピーコンストラクタを使用することをお勧めしますが、浅いコピーまたは深いコピーが適切かどうかを判断する必要があります。 SerializableやJAXBなどのシリアライゼーションAPIやさまざまなクローニングライブラリを使用して深いクローンを作成することもできます。あなたは関連する質問Java: recommended solution for deep cloning/copying an instanceで非常に素敵な議論を見つけることができます。

0

Object.clone()には多くの設計上の問題がありますが、依然としてオブジェクトをコピーする一般的で簡単な方法です。クローンを使用していくつかの利点は()

  • あるそれは)昔のプロジェクトのために、あなただけの、親クラスを定義することでCloneableを実装、クローン(の定義を提供する必要がある場合でも、クローニングを実装するための最も簡単な方法です方法とあなたは親のすべての子がクローン機能を取得する準備が整いました。
  • クローン作成には非常に少ないコードが必要です。深いコピーが不要な場合は、4または5行の長さのclone()メソッドを持つ抽象クラスのみが必要です。
  • クローニングは、配列をコピーする最速の方法です。
  • リリース1.5では、配列のクローンを呼び出すと、コンパイル時の型が複製される配列の型と同じである配列が返されます。これは、配列のクローンを呼び出すことは型キャストを必要としないことを意味します。

あなたは読むことができ、より上のJava Cloning - Copy Constructor versus Cloning