14

ScalaではAnyRef.clone、浅いコピーを実行しますか、それとも深いコピーを実行しますか?

4

1 に答える 1

21

短い答え:浅い。

それほど短くない答え: オーバーライドされない限り、 AnyRef.clone() は Java の Object.clone() を実装として使用します。

Object.clone() の Javadoc:

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

ご注意ください:

  1. AnyRef.clone() は、Java の対応するものと同様に、「保護された」アクセス レベルを持っているため、どこからでも呼び出すことはできません
  2. clone() を機能させるには、Cloneable を実装する必要があります。

長い答え: 効果的な Java、第 2 版、項目 11 を読む: 慎重にクローンをオーバーライドする

まとめ: 使わないでください。より良い代替手段があります。

于 2009-08-12T17:08:34.187 に答える