クローン可能なインターフェイスとスローする必要がある例外についての質問
質問
Javaのドキュメントは次のように述べています
クラスは、クローン可能なインターフェイスを実装して、そのメソッドがそのクラスのインスタンスのフィールドコピーを作成することが合法であることをObject.clone()メソッドに示すようにします。
クローン可能なインターフェイスを実装していないインスタンスでオブジェクトのクローンメソッドを呼び出すと、例外がスローされます。
慣習により、このインターフェイスを実装するクラスは、パブリックメソッドを使用してObject.Clone(保護されています)をオーバーライドする必要があります。この方法のオーバーライドの詳細については、object.clone()を参照してください。
このインターフェイスにはクローンメソッドが含まれていないことに注意してください。したがって、このインターフェイスを実装するという事実だけで、オブジェクトをクローンすることはできません。クローンメソッドが反射的に呼び出されたとしても、それが成功するという保証はありません。
そして、私はこれを持っています UserProfile
クラス:
public class UserProfile implements Cloneable {
private String name;
private int ssn;
private String address;
public UserProfile(String name, int ssn, String address) {
this.name = name;
this.ssn = ssn;
this.address = address;
}
public UserProfile(UserProfile user) {
this.name = user.getName();
this.ssn = user.getSSN();
this.address = user.getAddress();
}
// get methods here...
@Override
public UserProfile clone() {
return new UserProfile(this);
}
}
そして、ポルパスをテストするために、私はこれを行います main()
:
UserProfile up1 = new UserProfile("User", 123, "Street");
UserProfile up2 = up1.clone();
これまでのところ、コンパイル/実行に問題はありません。さて、ドキュメントについての私の理解に従って、削除 implements Cloneable
から UserProfile
クラスは例外をスローする必要があります up1.clone()
電話しますが、そうではありません。
クローン可能なインターフェイスが壊れていることをここで読みましたが、それが何を意味するのか本当にわかりません。私は何かが足りませんか?
解決
さて、ドキュメントについての私の理解に従って、削除
implements Cloneable
からUserProfile
クラスはスローし、例外を除く必要がありますup1.clone()
電話しますが、そうではありません。
あなたのクラスにまだの実装がある限り clone()
方法では、例外はそれを呼ぶときにもたらされることはありません - それは他の方法と同じように機能し、特別な魔法は関係ありません。
の実装 clone()
クラスで Object
例外を投げかけるものですが、その方法をオーバーライドしました。
他のヒント
つまり、cloneableを実装し、clone()メソッドを省略し、clone()メソッドを呼び出すと、例外がスローされます。
編集: :おそらく10億回前に言及されていますが、
クローンメソッドを使用しないでください!
クローニング機能が必要な場合は、代わりにコピーコンストラクターを提供してください。
インターフェイスは、clone()を実装することを強制しないため、壊れたと呼ばれます。
私は両方の回答に同意し、何かを追加します。インターフェイスは、クラスがclone()を実装すると言う「タグ」のようなものです。オブジェクトタイプがわからない場合、これはAPIのような方法で役立ちます。その後、書くことができます
if (myobj instanceof Cloneable) { dosmthng(); }