[解決済み] Java: インスタンスのディープクローン/コピーのための推奨ソリューション
質問
javaでインスタンスのディープクローン/コピーを行うための推奨される方法があるかどうか疑問に思っています。
私は3つの解決策を考えていますが、いくつか見逃している可能性があるので、あなたの意見を聞きたいと思います。
編集:Bohzoの提案と質問を修正しました:浅いクローンよりも深いクローンについてです。
自分でやってみる。
を手でコーディングし、プロパティの後にプロパティを追加して、ミュータブル・インスタンスもクローンされることを確認します。
のプロです。
- 実行される内容のコントロール
- 迅速な実行
コンサ
- 書くのも維持するのも面倒
- バグが起こりやすい(コピー&ペーストの失敗、プロパティの欠落、ミュータブルプロパティの再割り当て)
リフレクションを使用する。
独自のReflectionツールや外部ヘルパー(jakarta common-beansなど)を使えば、一行で仕事をこなす汎用的なコピーメソッドを簡単に書くことができます。
のプロです。
- 書きやすい
- ノーメンテナンス
cons:
- コントロールしにくい
- リフレクションツールがサブオブジェクトもクローンしない場合、ミュータブルオブジェクトでバグが発生しやすい。
- 実行速度が遅い
クローンフレームワークを使用する。
のような、代わりにやってくれるフレームワークを使います。
commons-lang SerializationUtils
Javaディープクローニングライブラリ
ドーザー
Kryo
のプロです。
- リフレクションと同じ
- クローンするものをより細かく制御できる。
の短所です。
- すべてのミュータブル・インスタンスは、階層の末端であっても完全にクローン化されます。
- 実行速度が非常に遅くなる可能性がある
バイトコードインスツルメンテーションを使用して、実行時にクローンを書き込む
javassit , BCEL または クグリブ を使えば、専用のクローナーを手書きと同じ速さで生成できるかもしれません。どなたか、このような目的でこれらのツールを使用したライブラリをご存知でしょうか?
何か見落としがあるのでしょうか?
おすすめはどれですか?
ありがとうございます。
解決方法は?
ディープクローン(オブジェクトの階層全体をクローンする)の場合。
-
commons-lang SerializationUtils - シリアライズの使用 - すべてのクラスが自分のコントロール下にあり、強制的に実装できる場合
Serializable
. -
Javaディープクローニングライブラリ - リフレクションを使う - クローンしたいクラスやオブジェクトが自分のコントロール外(サードパーティのライブラリ)にあり、それらを実装させることができない場合。
Serializable
を実装したくない場合やSerializable
.
浅いクローン(第一階層のプロパティのみをクローンする)用。
-
commons-beanutils BeanUtils です。 - をほとんどの場合使用します。
-
春のBeanUtils - は、すでにspringを使用していて、クラスパスにこのユーティリティがある場合です。
何をクローンして何をクローンしないかについては、上記のAPIがうまくコントロールしてくれます(たとえば
transient
または
String[] ignoreProperties
のように、車輪の再発明は好ましいことではありません。
関連
-
[解決済み] Javaにデストラクタはありますか?
-
undefinedeclipse エラー。この行に複数のアノテーションが見つかりました: - 文字列を型解決に解決できない
-
VMの初期化中にエラーが発生しました java/lang/NoClassDefFoundError: java/lang/Object
-
スレッド "main" で例外発生 java.lang.ArrayIndexOutOfBoundsException: 0 at One1.main(One1.java:3)
-
javaでよく使われる英単語
-
org.glassfish.jersey.servlet.ServletContainer
-
[解決済み] ディープクローンオブジェクト
-
[解決済み] Javaの「for each」ループはどのように機能するのですか?
-
[解決済み] Javaでenumを繰り返し処理するためのforループ
-
[解決済み】MySQL。同じMySqlインスタンスでMySQLデータベースをクローンする
最新
-
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 スレッド "AWT-EventQueue-0" で例外発生 java.lang.
-
myeclipseでコンパイルするとAntエラーが発生する javaの例外が発生しました。
-
VMの初期化中にエラーが発生しました java/lang/NoClassDefFoundError: java/lang/Object
-
Methodのinvokeメソッド実装のJavaリフレクション
-
node js npm gruntインストール、elasticsearch-head 5.Xインストール
-
Error: java.lang.NoClassDefFoundError: クラス XXXX を初期化できませんでした
-
SocketTimeoutExceptionの解決方法です。読み込みがタイムアウトした
-
java 例外。Javaツールの初期化
-
maven プラグイン エラー プラグインの実行は、ライフサイクル構成ソリューションの対象外です。
-
[解決済み] オブジェクトのディープコピーはどのように作るのですか?