33

インターフェイス.clone()でメソッドが指定されなかったのはなぜですか?java.lang.Cloneable

4

5 に答える 5

36

基本的に、それは壊れたインターフェースです。KenArnoldとBillVennersは、JavaDesignIssuesでそれについて議論しまし

アーノルド:

もし私がこの時点で神であり、多くの人が私がそうでないことを喜んでいるとしたら、問題があるので、私は非難Cloneableし、持っていると言うでしょう。スペルが間違っているという事実に加えて、メソッドが含まれていません。つまり、何かがのインスタンスであるかどうかをテストし、それをにキャストして、を呼び出すことはできません。もう一度リフレクションを使用する必要がありますが、これはひどいことです。それはたった一つの問題ですが、私が確かに解決したい問題です。CopyableCloneableCloneablecloneCloneableCloneableclone

于 2009-04-02T12:05:52.640 に答える
10

Java バグ データベースで次のバグを参照してください。

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4098033

基本的に、これは以前のバージョンの Java の設計上の欠陥であり、既存のコードとの互換性が損なわれるため、Cloneable インターフェイスで修正するつもりはありません。

于 2009-04-02T11:56:55.093 に答える
6

Javaには、このマーカーインターフェイスの概念があります。インターフェイスにはメソッドやフィールドがなく、Cloneableクローン可能であることのセマンティクスを識別するためだけに機能します。

dev-x Webサイトから:

多くの場合、動作のないJavaのインターフェースに出くわします。言い換えれば、それらは単なる空のインターフェース定義です。これらはマーカーインターフェイスとして知られています。JavaAPIのマーカーインターフェイスの例は次のとおりです。

于 2009-04-02T12:03:20.477 に答える
5

私が取り組んでいるプロジェクトでは、PublicCloneable というインターフェイスを作成しました。これには clone メソッドが含まれており、それがパブリックであることを指定しています。

これは便利だと思います。clone メソッドがあるのにアクセスできないという事実は、あまり役に立ちません。

public interface PublicCloneable extends Cloneable {
    public Object clone();
}
于 2009-04-02T12:35:23.193 に答える
1

クローンメソッドは、その「特別な」条件(あらゆる種類のオブジェクトのメモリコピー)のためにObjectクラスに実装されているためです。

于 2009-04-02T11:57:11.490 に答える