2011-07-07 20 views
1

私はオブジェクトをクローンする簡単なプログラムを持っていますが、私は "スレッドの例外"メイン "java.lang.CloneNotSupportedException:"エラーを見つけましたが、エラーを理解する助けが必要です。 obj1のクローンを取得する?クラスTestCloneableインタフェースを実装していないので、クローンを理解できません

public class Test{ 
int a; 
int b; 
public Test(int a , int b){ 
    this.a=a; 
    this.b=b; 
    } 
public static void main(String[]args) throws CloneNotSupportedException{ 
    Test obj1=new Test(2, 4); 
    Test obj2=(Test) obj1.clone(); 
     } 
} 
+0

する必要があり、権利を取得することは非常に困難です。あなた自身に恩恵を与え、コンストラクタをコピーするように切り替えます。関連項目:http://www.javapractices.com/topic/TopicAction.do?Id=71 –

答えて

4

問題が発生します。 API specsに記載されているように、

クラス[..]がインタフェースCloneableを実装していない場合、CloneNotSupportedExceptionがスローされます。

は、修正のような何かしようとするには: Cloneableインタフェースがメソッドを宣言しないので

public class Test implements Cloneable { 
    ... 
} 

を行うにはより多くの何もない(ちょうどSerializableのように、マーカーインタフェースと呼ばれています)。 Testクラスのインスタンスを今すぐ複製できます。

しかし、デフォルトのクローニングメカニズム(つまり、Objectのもの)は、探しているものと正確に一致しない場合があり、clone()メソッドをオーバーライドしたい場合があります。デフォルトでは、シャローコピーになります。つまり、クラスの新しいインスタンスが作成されますが、両方のインスタンスのフィールドは同じオブジェクトを参照します。例:

class C1 { 
    Object o; 
} 
class C2 implements Cloneable { 
    C1 c1; 
} 

... main ... { 
    C2 c2 = new C2(); 
    c2.c1 = new C1(); 
    c2.c1.o = new Object(); 
    C2 c2clone = c2.clone(); 
    System.out.println(c2 == c2clone); // prints false 
    System.out.println(c2.c1 == c2clone.c1); // prints true 
    c2.c1.o = new Object(); // modified both c2 and c2clone!!! 

最後の行は、両方ともc1の同じインスタンスを指しているため、c2とc2cloneの両方を変更します。最後の行でc2のみを変更する場合は、ディープコピーとする必要があります。

+0

はい、感謝しました。私たちがCloneableインターフェイスを実装していれば、これに答えてください.Cloneableのメソッドのどれが定義/オーバーライドしていますか?私たちのクラス? –

+1

'Cloneable'インタフェースにはメソッドがありません。これはちょうど 'Serializable'のようなマーカーです。 –

+1

@helloMaga:なし。 'Cloneable'メソッドはありません。 @cmvは前述のとおり、純粋なマーカーインターフェイスです(つまり、すべてが意味を持ち、いくつかのメソッドを実装する必要はありません)。別の一般的なマーカーインタフェースは 'Serializable'です。マーカーインタフェースは、通常、非常に優れた設計とはみなされませんが、存在します。 –

2

Cloneableを実装する必要があります。マーカーインターフェイスです。

あなたのプログラムは、私はあなたがクローンのパラダイムを使用しないように助言する

public class Test implements Cloneable{ 
     //rest of the program 
    } 
+0

Cloneableインターフェイスを実装している場合、Cloneableのメソッドのどれがクラスで定義/オーバーライドされていますか? –

+1

Cloneableはマーカーインターフェイスです。方法はありません。 – vinoth

+0

インターフェイスに宣言されたメソッドがない場合、開発者はそれを必要としますか?なぜそれはJava Docsにありますか?なぜ我々はそれを実装すべきですか?そのようなものが - interface MarkerExampl {}のようなものなら、私は空間と時間の無駄を感じます。私に教えてください。 –

関連する問題