Javaのドキュメントには次のように書かれています。
クラスはCloneableインターフェースを実装して、Object.clone()メソッドに、そのメソッドがそのクラスのインスタンスのフィールドごとのコピーを作成することが合法であることを示します。
Cloneableインターフェイスを実装していないインスタンスでObjectのcloneメソッドを呼び出すと、例外CloneNotSupportedExceptionがスローされます。
慣例により、このインターフェースを実装するクラスは、パブリックメソッドでObject.clone(保護されている)をオーバーライドする必要があります。このメソッドのオーバーライドの詳細については、Object.clone()を参照してください。
このインターフェースにはcloneメソッドが含まれていないことに注意してください。したがって、オブジェクトがこのインターフェイスを実装しているという事実だけでオブジェクトのクローンを作成することはできません。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()
ですが、そうではありません。
この辺りでCloneableインターフェースが壊れていることを読みましたが、それが何を意味するのか本当にわかりません。私は何かが足りないのですか?