2011-08-30 5 views
6

オブジェクトのコピーを作成し、そのデータにアクセスする目的で、何が良いの?オブジェクトを複製する

1.新しいオブジェクトを作成しているとして、あなたが

HashSet<String> myClone = new HashSet<String>(data); 

2.クローンオブジェクトコンストラクタを通じて クローンを作成するデータでそれを初期化し、あなたがそれを信じるタイプにキャスト

HashSet<String> myClone = (HashSet<String>) data.clone(); 
+2

可能な複製http://stackoverflow.com/questions/2356809/shallow-copy-of-a-map-in-java –

+2

@Mansoorは正しいです:コピーコンストラクタは間違いなく道のりです。 – mre

+0

@mre:コピーコンストラクタを使用すると、コピーされるオブジェクトと型が一致するオブジェクトではなく、新しいオブジェクトが指定された型のオブジェクトになります。場合によっては、これは非常に悪いことがあります。 ToyotaPriusに車両のコピーコンストラクタを呼び出すと、コピーされたToyotaPriusのものと一致する車両関連のプロパティを持つビークルが生成されますが、元のビークルのToyota-Prius固有の情報はコピーで省略されます。そのようなセマンティクスは時には望ましいことがありますが、しばしば望ましいものは、その特性が元のものと一致するToyotaPriusです。 – supercat

答えて

2

確かにコピーコンストラクタを使用してください - clone()は本当にかなり壊れています(少なくともほとんどの人はそうです)。詳細はhereを参照してください。

0

クローンデータをコピーしないこと、それは、参照(Shallow copy)をコピーします。だから、あなたが深い "コピー"をしたい場合、最初のものと独立していたら、 "item clonning"を行う必要があります。これは一般的にdeep copyと呼ばれています(これを実現する方法はいくつかあります)。

また、そのHashSetを実装するクラスのclone()メソッドを見てみることもできます。そのクラスがそのメソッドをオーバーライドしている場合、ディープコピーが実行される可能性があります。私はこの本をお勧めします:http://www.horstmann.com/corejava.html

1

「それに依存します」。すべてのクラスにコピーコンストラクタがあるわけではありません。一部のクラスはclone()を定義し、他のクラスはObjectから継承します。

自分のクラスでコピーセマンティクスを実装する方法を考えている場合、多くの人がクローンに対して推奨しますが、他の人はそれをお勧めします。 3番目の選択肢は、作業を行う静的なファクトリメソッドです。

既存のクラスのコピーを作成しようとしている場合は、既存の実装が必要です。おそらく、それはclone()を持っていて、あなたが望むことをしているのかもしれません。たぶんそれはコピーコンストラクタを持っているかもしれませんが、そうでないかもしれません。

関連する問題