読者です 読者をやめる 読者になる 読者になる

checkpoint

自分用のIT技術系ノートです。古い情報や間違っている情報もあるので注意。

オブジェクトの複製(ICloneable)

オブジェクトの複製(クローン)を作成したい場合、
別の変数に代入するのでは参照をコピーしているだけなので当然ダメ。
別のインスタンスを作成してフィールドの内容を全てコピーすればいいが、
手間がかかりすぎるし、変更に弱いので現実的な方法ではない。
どのみち外からではプライベートフィールドをコピーすることはできない。


そこで、Objectから継承されたMemberWiseCloneメソッドを使用してみる。


これを呼び出すと、インスタンスの"浅いコピー"を得ることができる。
"浅いコピー"とは、対象インスタンスのフィールドのうち、
参照型のものに関しては参照だけがコピーされるというもの。


これをインスタンスの外側から呼び出すには、
ICloneableインターフェイスを実装すればよい。
これは、Cloneというパブリックメソッドを持っている。
その中でMemberWiseCloneメソッドを利用すればいいわけだ。


インスタンス内の参照型フィールドまで完全に複製する"深いコピー"が必要なら、
そのフィールドのCloneメソッドを呼び出すしかない。
(当然、そのフィールドもICloneableを実装してないと不可能)