配列のディープコピーを正しく実行していると読んでいましたが、#clone()
がどのように実装されているのか混乱しました。それはjava.lang.Object
クラスのメンバーであり、そしてまだあなたがjavadocを読んでいる場合:#clone()がCloneableインターフェイスにないのはなぜですか?
まず、このオブジェクトのクラスは、インタフェースCloneableを実装していない場合、、CloneNotSupportedExceptionがスローされます。
なぜ、最初にclone
メソッドを定義しますか?インターフェイスが存在する場合にのみメソッドを使用できる場合は、そのメソッドをインターフェイスに配置します。 Cloneable
インターフェイス自体は空です。これは、clone
メソッドの使用が合法であることを保証するためにJavaによって使用される単なるマーカーインターフェイスです。
この方法はまた、型の安全性を確保するためにジェネリック医薬品を利用する機能を削除し、それをやって:
class Foo implements Cloneable { // Valid.
@Override
public Object clone() throws CloneNotSupportedException {
// ...
}
}
class TypeSafeFoo implements Cloneable<TypeSafeFoo> { // Not valid.
@Override
public TypeSafeFoo clone() throws CloneNotSupportedException {
// ...
}
}
はなぜJavaは、このようにそれを行っていますか?彼らに正当な理由があると確信していますが、私はそれを理解しているようには見えません。
実はこれは、これはクローニングが壊れたと考えられている多くの理由の一つであるジョシュア・ブロック –
で言った設計上の欠陥でした。 –