2009-08-12 8 views

答えて

21

短答:浅い。

それほど短くない答え: それは上書きでない限り、AnyRef.cloneは()の実装としてJavaのObject.clone()を使用しています。 Object.cloneに

のJavadoc():

クラスオブジェクト 方法クローンは、特定のクローニング操作を行います。 最初に、このオブジェクトのクラス がインタフェース Cloneableを実装していない場合、 CloneNotSupportedExceptionがスローされます。 すべての配列は、 がCloneableインタフェースを実装すると見なされることに注意してください。 それ以外の場合は、このオブジェクトのクラス のクラスの新しい インスタンスを作成し、 のすべてのフィールドを、このオブジェクトの 対応するフィールドの内容とまったく同じように初期化します。 の内容はフィールド自体は複製されません。 したがって、このメソッドは、 "深い コピー"操作ではなく、このオブジェクトの "浅い コピー"を実行します。

ご注意:

  1. AnyRef.clone()は、Javaでその対応のように、どこからでも呼び出し可能なので、そのない、 "保護" アクセスレベルを持っています。
  2. clone()を機能させるには、Cloneableを実装する必要があります。

長い答え:オーバーライドクローンは慎重

概要:それを使用しないでください効果的なJavaの第2版、アイテム11をお読みください。より良い選択肢があります。

+3

"より良い選択肢があります。"あなたはいくつか参照してもらえますか? –

+6

1. C++でコンストラクタをコピーします。 2. Scala 2.8.xに組み込みの "copy"メソッドを持つケースクラス。 3.不変オブジェクトを使用してください:コピーする必要はなく、共有するだけです。 –

+0

C++のようなコピーコンストラクタは実際にはScalaでは大丈夫ですか?私はC++からその言語に来て、私の最初のコピーコンストラクタを実行する前に、私がいくつかの点を見逃しているかどうかを見たいと思っていました。 (私のオブジェクトは状態が変わります)。 – akauppi

関連する問題