「なぜCloneable
廃止されないのですか?」に対する短い回答 (実際、がなぜX
非推奨にならないのかX
)は、それらを非推奨にすることにあまり注意が払われていないことです。
最近廃止されたもののほとんどは、それらを削除する特定の計画があるため、廃止されました。例えば、addPropertyChangeListener
及びremovePropertyChangeListener
方法のLogManagerをされたのJava SE 8で非推奨のJava SE 9でそれらを除去する目的で(その理由は、彼らが不必要にモジュールの依存関係を複雑にしていることである。)確かに、これらのAPIは、既にされている初期のJDK 9から削除開発ビルド。(同様のプロパティ変更リスナー呼び出しもから削除されていることに注意してPack200
ください。JDK-8029806を参照してください。)
そのような同様の計画がのために存在しないCloneable
とObject.clone()
。
より長い回答には、これらのAPIに起こりそうなこと、プラットフォームが非推奨になった場合にプラットフォームに発生するコストやメリット、APIが非推奨になった場合に開発者に伝えられることなど、さらなる質問についての議論が含まれます。私は最近のJavaOneの講演であるDebt and Deprecationでこのトピックを調査しました。(そのリンクでスライドが利用可能です。ビデオはこちらです。)JDK自体は、非推奨の使用法について一貫性があまりないことがわかりました。たとえば、次のようないくつかの異なる意味で使用されています。
これらはすべて別個の意味であり、それらの異なるサブセットは、非推奨のさまざまなものに適用されます。そして、それらのサブセットの一部は、非推奨ではないものに適用されます(ただし、非推奨にする必要があるかもしれません)。
Cloneable
そしてObject.clone()
、彼らは設計上の欠陥を持っているし、正しく使用することは困難であるという意味で「壊れた」されています。ただし、clone()
それでも配列をコピーするための最良の方法であり、複製には、慎重に実装されたクラスのインスタンスのコピーを作成するためのいくつかの限定された有用性があります。クローンの削除は互換性のない変更であり、多くのことを壊します。クローン操作は別の方法で再実装することもできますが、おそらくそれよりも遅くなりObject.clone()
ます。
ただし、ほとんどの場合、コピーよりもコピーコンストラクタの方が適しています。そのCloneable
ため、「廃止された」または「置き換えられた」などのマークを付けるのが適切な場合があります。これは、おそらく他の場所を調べたいと開発者に伝えますが、将来のリリースで複製メカニズムが削除される可能性があることを示すものではありません。残念ながら、そのようなマーカーは存在しません。
現状では、「非推奨」は最終的には削除されることを意味しているようです-廃止された機能のほとんどが削除されたという事実にもかかわらず-したがって、クローン作成メカニズムの非推奨は保証されていないようです。おそらく将来的には、代わりのメカニズムを使用するように開発者に指示する代替のマーキングを適用することができます。
更新
バグレポートにいくつかの履歴を追加しました。初期のJVM実装者であり、JVM仕様の共著者であるフランクイェリンは、他の回答で引用されているTRC勧告の「失われた時間の中で」のコメントに応えて、いくつかのコメントをしました。ここでは関連する部分を引用しました。完全なメッセージはバグレポートにあります。
Serializableにはないのと同じ理由で、Cloneableにはメソッドがありません。Cloneableは、クラスがサポートするメソッドについて具体的に何も言わずに、クラスのプロパティを示します。
リフレクションの前に、オブジェクトの浅いコピーを作成するためのネイティブメソッドが必要でした。したがって、Object.clone()が生まれました。また、多くのクラスがこのメソッドをオーバーライドすることを望み、すべてのクラスが複製されることを望まないことも明らかでした。したがって、Cloneableはプログラマーの意図を示すために生まれました。
つまり、要するに。Cloneableの目的は、パブリックclone()メソッドがあることを示すことではありませんでした。Object.clone()を使用してクローンを作成する意思があることを示すためであり、clone()を公開するかどうかを決定するのは実装次第でした。