箱から出してディープコピーすることは可能ですか?つまり、関数を手動でObject
コーディングする以外の方法です。clone
3 に答える
クローン作成は、必ずしもディープコピーを実行するわけではありません。実際、のデフォルトの実装は浅いコピーを
Object.clone()
作成します。オブジェクトのクロージャーが
Serializable
またはを実装するオブジェクトで構成されている場合は、およびを使用してディープコピーを作成Externalizable
できます...ただし、コストがかかります。ObjectOutputStream
ObjectInputStream
ライブラリは別の
cloning
オプションですが、コードを最初に読んだのは、引数のないコンストラクターを提供するグラフ内のすべてのオブジェクトのクラスに依存しているということです。次に、結果のオブジェクトにパッチを適用して、元のオブジェクトの状態のコピーを作成します。このプロセスは、引数なしのコンストラクターが実際に行うことによっては、望ましくない副作用をもたらす可能性があります。
要するに、私は普遍的な解決策があるとは思いません。
java.lang.reflectを使用することをお勧めします。
java.lang.Classはすべてのフィールドを公開し、パブリックフィールドの読み取りとパブリックメソッドの呼び出しを可能にします。
アクセサのないプライベートフィールドのみを複製することはできません。
cloning
ライブラリコードを簡単に見てみました。これは、シリアル化が行うこと、つまりオブジェクトの内部のグラフを取得することを実行し、ファイルに書き込む代わりに、オブジェクトのクローンであるメモリ位置=に書き込みます。したがって、シリアル化よりも高速ですが、確かに同じことを行います。