問題が発生します。 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のみを変更する場合は、ディープコピーとする必要があります。
する必要があり、権利を取得することは非常に困難です。あなた自身に恩恵を与え、コンストラクタをコピーするように切り替えます。関連項目:http://www.javapractices.com/topic/TopicAction.do?Id=71 –