2

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インターフェースが壊れていることを読みましたが、それが何を意味するのか本当にわかりません。私は何かが足りないのですか?

4

3 に答える 3

5

さて、ドキュメントの私の理解によればimplements Cloneable、クラスから削除するUserProfileと、呼び出しで例外がスローされるはずup1.clone()ですが、そうではありません。

クラスにメソッドの実装がまだある限り、clone()それを呼び出しても例外はもちろんスローされません。他のメソッドと同じように機能し、特別な魔法は必要ありません。

clone()in classの実装はObject例外をスローするものですが、そのメソッドをオーバーライドしました。

于 2010-05-22T15:51:22.817 に答える
1

つまり、Cloneableを実装し、clone()メソッドを省略してから、clone()メソッドを呼び出すと、例外がスローされます。

編集:それはおそらく以前に10億回言及されていますが、

クローンメソッドを使用しないでください!

クローン作成機能が必要な場合は、代わりにコピーコンストラクターを提供してください。

このインターフェイスは、clone()の実装を強制しないため、brokenと呼ばれます(実装する必要があります)。

于 2010-05-22T15:52:22.517 に答える
1

私は両方の答えに同意し、何かを追加します。インターフェースは、クラスがclone()を実装していることを示す「タグ」のようなものです。これは、オブジェクトタイプがわからない場合のAPIのようなメソッドで役立ちます。その後、あなたは書くことができます

if (myobj instanceof Cloneable) { dosmthng(); }
于 2010-05-22T15:58:54.293 に答える