[解決済み] clone() vs copy コンストラクタ vs ファクトリメソッド?
質問
Javaでclone()の実装についてググってみたところ http://www.javapractices.com/topic/TopicAction.do?Id=71
以下のようなコメントがついています。
コピーコンストラクタと静的ファクトリメソッドはcloneの代替手段を提供し、実装がより簡単になります。
私がしたいことは深いコピーを作ることだけです。 clone()を実装することは非常に理にかなっているように思えますが、このGoogleランキング上位の記事を見ると、少し怖くなりますね。
以下、気がついた問題点です。
コピーコンストラクタは Generics では動作しません。
以下はコンパイルできない擬似コードです。
public class MyClass<T>{
..
public void copyData(T data){
T copy=new T(data);//This isn't going to work.
}
..
}
サンプル1:ジェネリッククラスでコピーコンストラクタを使用する。
ファクトリーメソッドには標準的な名前がありません。
再利用可能なコードのためのインターフェイスを持つことは非常に素晴らしいことです。
public class MyClass<T>{
..
public void copyData(T data){
T copy=data.clone();//Throws an exception if the input was not cloneable
}
..
}
サンプル2:汎用クラスでclone()を使用する。
cloneは静的メソッドではないことに気づきましたが、それでもすべてのprotectedフィールドのディープコピーを作成する必要があるのではないでしょうか? clone()を実装する場合、クローン不可能なサブクラスで例外を投げる余分な労力は私には些細なことに思えます。
私は何かを見逃しているのでしょうか? どんな洞察も感謝されます。
どのように解決するのですか?
基本的には のクローンが壊れています。 . ジェネリックで簡単に動くものはないでしょう。もし、このようなものがあれば(ポイントを押さえるために短縮しています)。
public class SomeClass<T extends Copyable> {
public T copy(T object) {
return (T) object.copy();
}
}
interface Copyable {
Copyable copy();
}
それから、コンパイラの警告で、仕事を終わらせることができます。ジェネリックは実行時に消去されるため、コピーを行うものはコンパイラ警告でキャストが生成されることになります。
この場合は回避できない。
. いくつかのケースでは回避可能ですが(kb304さん、ありがとうございます)、すべてではありません。インターフェイスを実装するサブクラスまたは未知のクラスをサポートしなければならない場合 (必ずしも同じクラスを生成しないコピー可能なコレクションを反復していた場合など) を考えてみてください。
関連
-
アクセス制限です。タイプ 'Application' は API ではない(必要なライブラリに制限がある)。
-
java.sql.SQLException: executeQuery()でデータ操作文を発行できません。
-
API の戻り値を処理するために ResponseEntity を使用する
-
Javaがリソースリークに遭遇した:'input'が閉じない 解決方法
-
Javaがエラーで実行される、選択が起動できない、最近起動したものがない
-
Zipファイルの圧縮・解凍にantを使用する
-
[解決済み] JavaScriptでオブジェクトをディープクローンする最も効率的な方法は何ですか?
-
[解決済み] Java で、あるコンストラクタを別のコンストラクタから呼び出すにはどうすればよいですか?
-
[解決済み] Javaでオブジェクトをコピーするにはどうしたらいいですか?
-
[解決済み] C#で汎用リストをクローンする方法は?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
プロジェクトの依存関係を解決できない。
-
Javaクラスが "Error occurred during initialization of boot layer "というエラーで実行される。
-
Git Pull Failed マージされていないファイルがあるため、Pull できません。
-
スレッド "main" での例外 java.lang.ArrayIndexOutOfBoundsException:5 エラー
-
Junitのユニットテストはjava.lang.Testを報告します。
-
java.sql.SQLException: 結果セットの開始前
-
配列定数は初期化子でのみ使用可能です。
-
Java:未解決コンパイル問題の解決方法
-
ApiModel と @ApiModelProperty の使用法
-
[解決済み] Clone() vs Copyコンストラクタ - Javaではどちらが推奨されるか [duplicate].