1. ホーム
  2. java

[解決済み] Java: インスタンスのディープクローン/コピーのための推奨ソリューション

2022-04-20 13:16:31

質問

javaでインスタンスのディープクローン/コピーを行うための推奨される方法があるかどうか疑問に思っています。

私は3つの解決策を考えていますが、いくつか見逃している可能性があるので、あなたの意見を聞きたいと思います。

編集:Bohzoの提案と質問を修正しました:浅いクローンよりも深いクローンについてです。

自分でやってみる。

を手でコーディングし、プロパティの後にプロパティを追加して、ミュータブル・インスタンスもクローンされることを確認します。

のプロです。

- 実行される内容のコントロール

- 迅速な実行

コンサ

- 書くのも維持するのも面倒

- バグが起こりやすい(コピー&ペーストの失敗、プロパティの欠落、ミュータブルプロパティの再割り当て)

リフレクションを使用する。

独自のReflectionツールや外部ヘルパー(jakarta common-beansなど)を使えば、一行で仕事をこなす汎用的なコピーメソッドを簡単に書くことができます。

のプロです。

- 書きやすい

- ノーメンテナンス

cons:

- コントロールしにくい

- リフレクションツールがサブオブジェクトもクローンしない場合、ミュータブルオブジェクトでバグが発生しやすい。

- 実行速度が遅い

クローンフレームワークを使用する。

のような、代わりにやってくれるフレームワークを使います。

commons-lang SerializationUtils

Javaディープクローニングライブラリ

ドーザー

Kryo

のプロです。

- リフレクションと同じ

- クローンするものをより細かく制御できる。

の短所です。

- すべてのミュータブル・インスタンスは、階層の末端であっても完全にクローン化されます。

- 実行速度が非常に遅くなる可能性がある

バイトコードインスツルメンテーションを使用して、実行時にクローンを書き込む

javassit , BCEL または クグリブ を使えば、専用のクローナーを手書きと同じ速さで生成できるかもしれません。どなたか、このような目的でこれらのツールを使用したライブラリをご存知でしょうか?

何か見落としがあるのでしょうか?

おすすめはどれですか?

ありがとうございます。

解決方法は?

ディープクローン(オブジェクトの階層全体をクローンする)の場合。

  • commons-lang SerializationUtils - シリアライズの使用 - すべてのクラスが自分のコントロール下にあり、強制的に実装できる場合 Serializable .

  • Javaディープクローニングライブラリ - リフレクションを使う - クローンしたいクラスやオブジェクトが自分のコントロール外(サードパーティのライブラリ)にあり、それらを実装させることができない場合。 Serializable を実装したくない場合や Serializable .

浅いクローン(第一階層のプロパティのみをクローンする)用。

何をクローンして何をクローンしないかについては、上記のAPIがうまくコントロールしてくれます(たとえば transient または String[] ignoreProperties のように、車輪の再発明は好ましいことではありません。