4

Cloneableクラスがこのクラスのオブジェクトでない場合、クローンを作成できません。では、なぜインターフェイスではなくクラスにclone()保持されるのでしょうか?ObjectCloneable

4

2 に答える 2

2

これは Java の設計ミスでした (そうです、Java は完璧ではありません!)。

Java での複製は避けたほうがよいでしょう。たとえば、Josh Bloch は、Effective Java の項目 11 で次のように指摘しています。

Cloneable インターフェースは、オブジェクトが複製を許可することをアドバタイズするための mixin インターフェース (項目 18) として意図されていました。残念ながら、それはこの目的を果たせません。その主な欠点は、クローン メソッドがないことと、オブジェクトのクローン メソッドが保護されていることです。オブジェクトが Cloneable を実装しているという理由だけで、リフレクション (項目 53) に頼らない限り、オブジェクトで clone メソッドを呼び出すことはできません。オブジェクトがアクセス可能な clone メソッドを持っているという保証がないため、反射的な呼び出しでさえ失敗する可能性があります。この欠陥やその他の欠陥にもかかわらず、この機能は広く使用されているため、理解する価値があります.

オブジェクトを複製可能にする場合は、コピー コンストラクターまたはコピー メソッドを実装します。

于 2011-09-14T06:45:45.513 に答える
0
  1. Cloneable はマーカー インターフェイスであり、ユーザー/開発者がクラスが clonebale かどうかを確認するための属性のように機能します。

  2. clone() は Object クラスに保持されます。これは、clone() の実装では、スーパーの clone() を呼び出すことをお勧めします。これは、(Cloneable を実装することによって) クローン可能とマークされていなくても、スーパー クラスにクローン関数がある場合にのみ発生する可能性があります。 clone() 関数をオブジェクトに保持することは理にかなっています。

  3. clone() はクラスの別のインスタンスを完全に作成し、コンストラクターと同様に、完全なインスタンスを作成するためにスーパーのメソッドを呼び出す必要があります。

于 2011-09-14T06:44:39.427 に答える