2012-04-08 6 views
4
に私はJavaでクローニングについて読んでいた

をオブジェクトを複製するのに必要なものです?どのようなリアルタイムの例も理解に役立ちます。</p> <p>は、私はJavaでオブジェクトのクローンを作成する必要がありますなぜ私が思っていたなどのオブジェクトの浅い/深いコピーを作成する方法、Javaの

+0

[Javaでclone()メソッド]の可能な重複(http://stackoverflow.com/questions/6384826/clone-method-in-java) ...またはhttp://stackoverflow.com/questions/6182565/java-deep-copy-shallow-copy-cloneまたはhttp://stackoverflow.com/questions/5279256/is-clone-in-java-shallow-コピー、または他の何十もの。新しい質問をする前に検索を使用してください。多くの人が尋ねられ答えられました。 –

+0

こんにちはブライアン。私はそれを検索しましたが、ほとんどの投稿では、浅いコピーと深いコピーの実装または違いのみが与えられました。私は浅い/深いクローンについて知っています。ちょうどJavaでオブジェクトをクローン化する理由を知りたいのですが? – Anand

答えて

2

かなり頻繁に、あなたはケースのクローニングは、コードの重要な部分である不変オブジェクトを、使用したいです。たとえば、リストまたは配列型フィールドを持つ不変オブジェクトがある場合、不変性を保持するために、ゲッターは常にリストまたは配列のクローンを返す必要があります。あなたは、いくつかの状態変更メソッドを呼び出すだけで、それらのすべてが成功した場合、結果が見えるようにしたいときは、「トランザクション」の変更をしたいとき

他の典型的なユースケース

です。

+0

あなたが不変オブジェクトのフィールドとしてリストを持つと言ったように、私はゲッターでそのリストのクローンを返さなければならないが、私は新しいリストを作成し、それを返すことができる。また、リストのインターフェイスは、クローンメソッドを持っていません実装クラスのみがメソッドをクローンしている。私はなぜクローンを使用する必要がありますか? – Anand

+0

@anand私は、一般的な操作としてのクローニングを意味しました。クローン作成の1つの方法は、確かにコピーコンストラクタを使用することです。もう一つは 'clone()'メソッドを実装することです。クローニングをどのように達成するかは重要ではありませんが、一方の方法は他方の方法と同じくらい良い方法です。 – biziclop

8

何かのクローンコピーを持つことは、「前」バージョンと「後」バージョンを持つことができることを意味します。コピーを使って何かを試している間は、オリジナルをそのままにしておくことができます。元のバージョンに戻すだけで元に戻すことができます。

+0

私はそれを理解しています。しかし、あなたが私にオリジナルのオブジェクトだけを残してオブジェクトのコピーでテストしなければならない実際のインスタンスを私に教えてもらえれば、それは私に物事をより明確にします。 – Anand

+0

私は@biziclopがあなたがコピーをテストしたいシナリオを提案したと思います。つまり、おそらくトランザクションでコピーが成功したかどうかをテストする必要があります。検証の問題やデータベーストランザクションの失敗のためにコピーが成功しない場合は、コピーを破棄して再作成せずに元の状態に戻すことができます。 – DOK

+0

はい、私はそれを得ました。もう一つは、私はオブジェクトを初期化するときにオブジェクトを複製するのが高価すぎるということを読んでいます。新しいオブジェクトを作成するのではなく、既存のオブジェクトを複製して新しいインスタンスに重要なプロパティを変更するだけです。それに光? – Anand

0

オブジェクトの深いクローンコピーを使用することができます。これは、後で使用する方法で部分的な結果が必要な場合があるためです。

0

エンキャプシュレーションを維持するために、コードをより堅牢にする方法として、ゲッターから戻す前にオブジェクトをクローンすることができます。たとえば、getDateメソッドは、呼び出し元に戻る前に日付フィールドをクローンします。

+0

あなたが言ったように、私は戻る前に日付フィールドを複製することができますが、私はまた、新しい日付オブジェクトを作成することができますなぜここでクローンを使用する必要がありますか? – Anand

1

自身のクローンを作成するよう、我々は、オブジェクトのクローンを言うとき、それは既存のものの別の同じオブジェクトを作成したり、持っていることを意味Javaではので、何かの重複コピーを言います。

クローニングはいつですか?我々が作成し、新しいオブジェクトのを見てたびに時間がかかる場合や、我々は、我々は、クローニングを使用して、すべての準備ができて作成されたオブジェクトw.r.t同じか少し差を有する新たなオブジェクトが必要です。

クローニング

  • シャローコピー
  • ディープコピー

シャローコピーをクローニング

浅いコピー処理であるJavaで3種類の

ありますオブジェクトの状態は別のオブジェクトにコピーされるbu両方のオブジェクトは、ヒープ領域内の同じ参照を指しています。

ディープコピー

ディープコピーでは、2つの別々のオブジェクトが作成され、ディープコピーでいます。これで、あるオブジェクトの各フィールドが別のオブジェクトにコピーされます。

今、Javaでこの困難を克服するための第三のカテゴリーは、クローニングの概念です。

クローン化は、クローン可能なインタフェースを実装しています。 Cloneableはマーカーインターフェイスです。

クローニングについての深い知識を参照してください:Cloning in java

関連する問題