Cloneable
Javaが本質的に壊れています。特に、私の最大の問題は、メソッドそのものを定義しないメソッドの振る舞いを期待することです。したがって、Cloneable
リストをトラバースする場合は、定義された動作にアクセスするためにリフレクションを使用する必要があります。しかし、Java 8では既定のメソッドが用意されていますが、今度は、にデフォルトのclone()
メソッドがない理由を尋ねます。Javaでクローン可能なデフォルトのクローン()がない理由8
私はなぜinterfaces cannot default Object methodsだと理解していますが、これは明示的な設計上の決定であり、例外があります。
私は一種のObject.clone()
を卑下してのようなものに、その内部のコードを変更する想像:
if(this instanceof Cloneable) {
return ((Cloneable) this).clone();
}
else {
throw new CloneNotSupportedException();
}
そしてclone()
はCloneable
のデフォルトの方法として、そのことを行うことになりどんな魔法に移動。これはまだ実際にはclone()
が簡単に間違って実装される可能性があることを修正するものではありませんが、それ自体の別の議論です。現在clone()
をオーバーライドしますがCloneable
(WHY ?!)もまだ機能的に不可能な場合(技術的には大丈夫だろう実装されていませんでした
- クラス:私の知る限り、まだこの変更が完全に下位互換性だろうことができますよう
しかし、それは以前とはまったく異なっていません)。
- 現在
clone()
をオーバーライドしていますが、Cloneable
を実装していたクラスは、実装上も同じように機能します。 - 現在、
clone()
をオーバーライドしていませんが、Cloneable
(WHY ?!)を実装したクラスは、が完全にでない場合でも、仕様に準拠します。 - 反射を使用し、
Object.clone()
と呼ばれるものは、機能的にはまだ機能します。 super.clone()
は、Object.clone()
を参照していても機能的には同じです。
これは言うまでもなく、Cloneable
という大きな問題を解決します。面倒で実装が簡単ではありませんが、インタフェースではオブジェクト指向の巨大な問題を解決できます。
Cloneable
を実装している唯一の問題は、clone()
を上書きする義務がありませんが、これは前と同じです。
これは内部的に説明されていますが、決して実現できませんでしたか?もしそうなら、なぜですか?インターフェイスがデフォルトのObjectメソッドを使用できないという理由で、Cloneable
を継承するすべてのオブジェクトがclone()
を予期しているので、この場合例外を作成するのは意味がありませんか?
「Cloneable」がとても壊れていて、修正する価値がないと(公式ソースから)どこかで読んでいることを覚えています。しかし、あなたのデフォルトのメソッドの問題の1つは、 'this'を使うことは難しいことです。 – Tunaki
本質的に、@就活が言っていることは正しいです。このようなフープジャンプの複雑さに対する復帰は、そこにはなかった。私たちは{時間、努力、複雑さ}予算を他の分野に投資してより多くの価値を生み出しました。 –
このような 'default'メソッドの作成には意味がありません。 'java.lang.Object'にメソッドがあり、' interface'に同じ名前と署名の 'default'メソッドがある場合、' java.lang.Object'で宣言されたメソッドは未修飾呼び出しのために勝ちます。 'java.lang.Object'のメソッドが' protected'のままであれば、 'Cloneable'実装は' public'メソッドを再宣言するよう強制されますが、 'public'に変更すると既存の実装を変更する必要があります。言い換えれば、結果は 'Cloneable'インタフェースで' abstract clone() 'メソッドを定義することと変わりありません。 – Holger