[解決済み] なぜCloneableは非推奨なのですか?
質問
一般に、次のように理解されています。
Cloneable
インターフェースは壊れていると理解されています。これには多くの理由がありますが、ここでは触れません。
その他
がすでにやってくれました。の立場でもあります。
Javaアーキテクト
の立場そのものです。
私の質問は、なぜまだ非推奨にされていないのか、ということです。もしコア Java チームが壊れていると判断したのであれば、非推奨も考慮されているはずです。そうしない理由は何でしょうか (Java 8 では はまだ非推奨です。 )?
どのように解決するのですか?
あるところに
バグ
に 1997 年に提出された
Java バグデータベース
を追加したことについて
clone()
メソッドを
Cloneable
に変更し、無駄をなくしました。これは、解決策 "won't fix" で閉じられ、正当性は次のとおりでした。
Sun の技術検討委員会 (TRC) はこの問題を詳細に検討し、次のように勧告しました。 を取ることを推奨しました。 を改善する以外の行動をとることを推奨しました。 現在の Cloneable インターフェイスのドキュメントを改善する以外の . 以下は、勧告の全文です。 勧告の全文です。
既存のJavaオブジェクトクローンAPIには問題がある。 java.lang.Objectに java.lang.Objectにprotected "clone"メソッドがあり、インターフェイスがあります。 java.lang.Cloneableがあります。 その意図は、もしあるクラスが他の人にそのクラスのクローンを作らせたいのであれば クラスが他の人にクローンすることを望むなら、Cloneableインターフェイスをサポートし、デフォルトのprotected cloneableをオーバーライドしなければなりません。 インターフェイスをサポートし、デフォルトの protected clone メソッドを public clone メソッドで上書きすることです。 残念ながら、都合よく時の流れの中で失われてしまった理由のために Cloneable インターフェースは clone メソッドを定義していません。 メソッドを定義していません。
この組み合わせはかなりの量の混乱を招きます。 いくつかのクラスは はCloneableをサポートすると主張しますが、誤ってcloneメソッドをサポートすることを忘れてしまいます。 clone メソッドをサポートしていないクラスがあります。 開発者は、Cloneable がどのように動作することになっているのか、そして clone が何をすることになっているのかについて混乱しています。 開発者は、Cloneable がどのように動作し、clone が何を行うことになっているのかについて混乱しています。
残念ながら、Cloneable に "clone" メソッドを追加することは、互換性のない変更になります。 互換性のない変更です。 バイナリの互換性は壊れませんが、ソースの互換性は壊れます。 ソースの互換性は失われます。 事例として、実際には 実際には、クラスが Cloneable インターフェースをサポートしているにもかかわらず、パブリックな clone メソッドを提供できていないクラスが、実際には数多く存在することを示す逸話があります。 議論の結果 議論した結果、TRC は満場一致で、互換性を保つために既存の 互換性に影響を与えるため、既存の Cloneable インターフェースを修正しないことを満場一致で推奨しました。
代替案として、新しいインターフェイス java.lang.PubliclyCloneable を追加して、Cloneable の本来の意図された目的を反映させることです。 を追加することでした。 5 対 2 の多数決で、TRC はこれに反対を推奨しました。 主な懸念は、これがさらに多くの混乱(スペルの混乱を含む!)を追加することになるということでした。 スペルの混乱も!)、すでに混乱している図式にさらに混乱を加えることになるということです。
TRC は満場一致で、既存の Cloneable インターフェイスに追加のドキュメントを追加することを推奨しました。 既存の Cloneable インターフェイスに追加のドキュメントを追加することを推奨します。 をよりよく説明するために どのように使用されることを意図しているか、そして実装者のための "ベストプラクティス" を記述するために、既存の Cloneable インターフェイス を説明することです。
ということで、これは直接的には関係ないのですが
非推奨
を非推奨としない理由は、Technical Review Comitee の判断によります。
既存のドキュメントを修正することで十分である
を決定したからです。そして、そうしたのです。Java 1.4 までは。
Cloneable
は次のように文書化されていました。
クラスは Cloneable インターフェースを実装しており、そのインターフェイスは Object.clone()メソッドに、そのメソッドがそのクラスのインスタンスのフィールド間のコピーを作成することが合法であることを示すために、Cloneableインターフェイスを実装します。 メソッドに対して、そのクラスのインスタンスをフィールドごとにコピーすることが合法であることを示します。
Cloneableインターフェイスを実装していないインスタンスを複製しようとすると、例外CloneNothing! インターフェイスを実装していないインスタンスを複製しようとすると、例外 CloneNotSupportedException がスローされます。 が投げられます。
Cloneable インターフェースはメソッドを宣言していません。
2002年2月にリリースされたJava 1.4以降、現行版(Java 8)までは、以下のようになります。
<ブロッククオートクラスはCloneableインターフェイスを実装しており、そのインターフェイスは Object.clone()メソッドに、そのメソッドがインスタンスのフィールドごとのコピーを作成することが合法であることを示すために、Cloneableインターフェイスを実装します。 メソッドに対して、そのクラスのインスタンスをフィールドごとにコピーすることが合法であることを示します。 Objectの を実装していないインスタンスに対して、Object.clone() メソッドを呼び出すと、例外CloneNothing() が発生します。 インターフェイスを実装していないインスタンスに対して Object の clone メソッドを呼び出すと、例外 CloneNotSupportedException がスローされます。 がスローされます。
慣習として、このインタフェースを実装するクラスは、(protected である)Object.clone を public メソッドでオーバーライドしなければなりません。 Object.clone (protected) をパブリックメソッドでオーバーライドする必要があります。このメソッドのオーバーライドの詳細については Object.clone()を参照してください。
このインタフェースはcloneメソッドを含んでいないことに注意してください。そのため このインターフェイスを実装しているという事実だけで、オブジェクトを複製することはできません。 このインターフェイスを実装しているという事実だけでは、オブジェクトのクローンを作ることはできません。たとえcloneメソッドを反射的に呼び出したとしても を反射的に呼び出したとしても、それが成功する保証はない。
関連
-
スレッド "main" で例外発生 java.lang.ArrayIndexOutOfBoundsException: 4 at text.Division.main(Divisi
-
[解決済み] この2回(1927年)を引き算すると、なぜおかしな結果になるのでしょうか?
-
[解決済み] なぜパスワードにはStringではなくchar[]が好まれるのですか?
-
[解決済み] serialVersionUIDとは何ですか、またなぜそれを使用する必要がありますか?
-
[解決済み] B "の印刷が "#"の印刷より劇的に遅いのはなぜですか?
-
[解決済み] リフレクションとは何か、なぜ有用なのか?
-
[解決済み] メソッドを廃止または非推奨としてマークする方法は?
-
[解決済み] なぜJavaのVector(およびStack)クラスは時代遅れ、または非推奨とされているのですか?
-
[解決済み] Java 8のインターフェイスメソッドで "final "が使えないのはなぜですか?
-
[解決済み】なぜJavaの+=, -=, *=, /=複合代入演算子はキャスティングを必要としないのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
eclipse アクセス制限です。タイプ 'xxx' は API ではありません(必須ライブラリ '' の制限)。
-
Dateが型に解決できない問題を解決する
-
Android Studio 3.1.2 で v4, v7 パッケージが見つからない シンボル 'AppCompatActivity' を解決できない
-
JQuery DataTable 详解
-
Eclipseでプロジェクトエクスプローラービューとパッケージエクスプローラービューを使う
-
VMの初期化中にエラーが発生しました java/lang/NoClassDefFoundError: java/lang/Object
-
javaコンパイル時のエラー:不正な文字 '\ufeff' に対する解決策です。
-
が 'X-Frame-Options' を 'deny' に設定しているため、フレーム内にある。
-
Eclipse起動エラー:javaは起動したが、終了コード=1を返した(ネット上の様々な落とし穴)
-
org.glassfish.jersey.servlet.ServletContainer