クローン可能なインターフェイスとスローする必要がある例外についての質問

StackOverflow https://stackoverflow.com/questions/2888719

質問

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(); }
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top