インターフェイス.clone()
でメソッドが指定されなかったのはなぜですか?java.lang.Cloneable
5 に答える
基本的に、それは壊れたインターフェースです。KenArnoldとBillVennersは、JavaDesignIssuesでそれについて議論しました。
アーノルド:
もし私がこの時点で神であり、多くの人が私がそうでないことを喜んでいるとしたら、問題があるので、私は非難
Cloneable
し、持っていると言うでしょう。スペルが間違っているという事実に加えて、メソッドが含まれていません。つまり、何かがのインスタンスであるかどうかをテストし、それをにキャストして、を呼び出すことはできません。もう一度リフレクションを使用する必要がありますが、これはひどいことです。それはたった一つの問題ですが、私が確かに解決したい問題です。Copyable
Cloneable
Cloneable
clone
Cloneable
Cloneable
clone
Java バグ データベースで次のバグを参照してください。
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4098033
基本的に、これは以前のバージョンの Java の設計上の欠陥であり、既存のコードとの互換性が損なわれるため、Cloneable インターフェイスで修正するつもりはありません。
Javaには、このマーカーインターフェイスの概念があります。インターフェイスにはメソッドやフィールドがなく、Cloneable
クローン可能であることのセマンティクスを識別するためだけに機能します。
dev-x Webサイトから:
多くの場合、動作のないJavaのインターフェースに出くわします。言い換えれば、それらは単なる空のインターフェース定義です。これらはマーカーインターフェイスとして知られています。JavaAPIのマーカーインターフェイスの例は次のとおりです。
私が取り組んでいるプロジェクトでは、PublicCloneable というインターフェイスを作成しました。これには clone メソッドが含まれており、それがパブリックであることを指定しています。
これは便利だと思います。clone メソッドがあるのにアクセスできないという事実は、あまり役に立ちません。
public interface PublicCloneable extends Cloneable {
public Object clone();
}
クローンメソッドは、その「特別な」条件(あらゆる種類のオブジェクトのメモリコピー)のためにObjectクラスに実装されているためです。