2013-05-12 11 views
16

私はClonableを実装し、いくつかのクラスコード、ドキュメントの状態に出くわした:私のクラスにCloneableを実装させる際のポイントは何ですか?

クラスは、それがフィールド - を作るためにそのメソッドのために合法的であるObject.clone()メソッドを示すために、Cloneableインタフェースを実装そのクラスのインスタンスのフィールドコピー。 Cloneableインタフェースを実装していないインスタンスでObjectのcloneメソッドを呼び出すと、CloneNotSupportedException例外がスローされます。 慣例により、このインタフェースを実装するクラスは、保護されたObject.cloneをパブリックメソッドでオーバーライドする必要があります。このメソッドのオーバーライドの詳細については、Object.clone()を参照してください。 このインターフェイスには、cloneメソッドが含まれていないことに注意してください。したがって、単にこのインタフェースを実装しているため、オブジェクトをクローン化することはできません。クローンメソッドが反映されても、それが成功するという保証はありません。

このクラスを実装する上でのポイントは理解できません。ドキュメントでは.cloneメソッドがインターフェイスに実装されていないため、実装する必要があります。なぜこのクラスを使うのですか?なぜ私はこのクラスを実装せずにオブジェクトコピーを作成するために私のクラスにメソッドcopyClassを書き込んでいないのですか?

ありがとうございます。

+1

クラスにはCloneableが実装されているため、組み込みのクローニングメカニズムを使用できるため、他のクラスでは独自のクローンメソッドを知らなくてもクローンを作成できます。はい、それはそれを管理するためのちょっと変わった方法ですが、部分的には下位互換性と関係しています。 –

答えて

22

cloneメソッドを実装するには、単に実行します。

public Object clone() throws CloneNotSupportedException { 
    return super.clone(); 
} 

あなたはもちろん、必要に応じて、より深いコピーを作成する方法をカスタマイズすることができます。

super.clone()を呼び出すのは、クラスがfinalでオーバーライドできない限り、ほとんどの場合必須です。clone()メソッドは、呼び出されたオブジェクトと同じクラスのインスタンスを返さなければなりません。したがって、単純に新しいインスタンスを作成して状態をコピーするだけで、このクラスでは動作しますが、すべてのサブクラスでは動作しません。さらに、スーパークラスに含まれるすべての状態に常にアクセスするとは限りません。

つまり、Objectのprotectedクローンメソッドをpublicにします。そしてObject.clone()メソッドが最初に行うことは、(これは実際のコードではありませんが、これはメソッドが何をするかである)である:だから

if (!(this instanceof Cloneable)) { 
    throw new CloneNotSupportedException(); 
} 

CloneableObject.clone()方法があることを知らせるための単なるマーカーインタフェースです呼び出されたときに例外をスローしてはなりません。

これは、Javaで最もひどく設計された部分の1つです。通常、clone()の代わりにコピーコンストラクタを使用する方がよいでしょう。

+0

私はあなたの答えから理解できますが、今日、このインタフェースを使用することはお勧めできません。オブジェクトクラスのクローンメソッドを使用したい場合は、実装する必要があります。私の場合(この実装を見たクラス)、クラスのより深いコピーが実装されました。この場合、このインターフェイスを実装する理由は何ですか? –

+0

'Object.clone()'メソッドをオーバーライドして使いたい場合は、このインタフェースを実装する必要があります。あなたが別の方法でコピーを実行したい場合は、何でもしてください。 –

+0

Object.clone()をオーバーライドすると、このインターフェイスを使用するように強制されます。有益な答えをありがとう。 –

1

より一般的なコードを書くことができます。 Cloneableインターフェイスを実装する複数のクラスがあり、そのインスタンスをメソッドの引数として渡す場合は、1つの変数タイプで異なる複数のメソッドを作成する必要はありません。Cloneable tを使用できます。他のインターフェイスと同じです。そして、他のすべてのインターフェースと同じですが、多分継承です。これらのインターフェイスを実装することで、コードを読みやすくすることができます。

関連する問題