2011-07-26 15 views
6

クローンはオブジェクトのコピーを作成するためにオブジェクトコンストラクタを呼び出しません。どのアルゴリズムがクローンを使用していますか?フードの中でクローンはどのように機能しますか?

ネイティブメソッドクローンの実装の詳細を探しています。すべてのポインタが評価されます。

私はクローンの欠点を認識しています。

答えて

3

protected native Object clone()。私は正確にはわかりません(ネイティブコードを調べる必要があります)が、JVM内のオブジェクトの新しいインスタンスを作成し、すべてのフィールドをコピーします。

しかし、clone()は使用しないでください。正しく取得するのは難しいです。詳細the Javadocにレイアウトされている仕組み

+1

'clone()'の使用を避けるために+1 –

+0

hmm ...私はネイティブ実装の仕方について考えています。 – vinoth

3

ためthis questionを見てください:

方法cloneクラスObjectためには、特定の複製処理を実行します。最初に、このオブジェクトのクラスがインタフェースを実装していない場合、CloneNotSupportedExceptionがスローされます。すべての配列は、Cloneableインタフェースを実装すると見なされることに注意してください。そうでない場合は、このメソッドはこのオブジェクトのクラスの新しいインスタンスを作成し、そのオブジェクトの対応するフィールドの内容をすべてのフィールドで初期化します。フィールドの内容自体は複製されません。したがって、このメソッドは、「ディープコピー」操作ではなく、このオブジェクトの「シャローコピー」を実行します。

たとえば、ナイーブで浅いフィールド単位のコピーは、オブジェクトのビット単位のコピーに非常に近い(ただし、おそらく完全ではない)。

ネイティブメソッドクローンの実装の詳細を探しています。

これは、JVMの実装方法によって異なります。それがあなたの心配なら、それはかなり効率的な操作である可能性が高いです。

0

Object.clone()の実装は、オブジェクトのクラスがCloneableを実装しているかどうかをチェックし、単純に新しいインスタンスを割り当て、フィールド単位のシャローコピーを行うネイティブメソッドです。コピーはメモリコピーを使用して実行される可能性が最も高い - これ以上何もする必要はない。 (しかし、実際に知りたければ、OpenJDKのソースコードを見てください)

1

cloneは、AllocObjectメソッドを使用して実装されています(これはコンストラクタを呼び出さずに新しいオブジェクトを作成します〜NewObject)。新しいオブジェクトを作成したら、リフレクションを使用してすべてのフィールドを浅くコピーします。

しかし、やはり、clone/Clonableのメカニズムは、Javaでは根本的に壊れています。ジョシュア・ブロッホには、それに関するセクションがEffective Javaにあります。それに関連するものもいくつかあります。SO questions

+0

+1はJoshua Blockのリンクですが、クローン機能と同様に壊れています。ここでは直接読むことができるものがあります:http://www.artima.com/intv/bloch13.html –

関連する問題