シェアする

  • このエントリーをはてなブックマークに追加





【java】オブジェクトをコピーする方法色々

シェアする

  • このエントリーをはてなブックマークに追加
  • 0

javaでオブジェクトコピーというと、

どのようなコードをイメージされますか?

こんな感じですか?

javaでは上記コードではオブジェクトは参照渡しとなるため、

sample2はsample1と同じものを指します。

sample2のcol1をBとセットすると、

同じものを指すsample1の方もcol1はBとなります。

では、オブジェクトをコピーするにはどうしたらよいでしょうか??

Cloneableインターフェースを実装する

Cloneableインターフェースという、実装のないインターフェースがあります。

Serializableと同じように、Cloneできることができるマークのようなものです。

このインターフェースを実装すると、ObjectクラスにあるCloneメソッドを

overrideすることでオブジェクトをコピーすることができます。

例えばCloneableを実装したDTOはこんな感じになります。

この中のcloneメソッドがオブジェクトをコピーしている処理になります。

実際の使い方とCloneableを実装しない場合の挙動

同じ構成で以下のように、Cloneableを実装しないDTOを用意して、

実装有無での動作の違いを見てましょう。

こちらが主処理になります。

これを実行すると・・・

こんな感じでエラーログが出力されます。

要するに、Cloneableを実装していないのにcloneはできないよということですね。

では、Cloneableを実装した方は、hashcodeの違う別のオブジェクトとして、

cloneが成功し、複製ができていることがわかりますね。

Cloneableインターフェースを実装できないときは?

ですが、たとえばjarの中にあってCloneableを自分で実装できないものを

複製しなければいけなかったりしたらどうしたらよいでしょうか?

コピー対象がSerializableを実装しているとき

コピー対象がSerializableを実装しているのであれば、

シリアライズ・デシリアライズすることでコピーすることができます。

例えば、こんな感じでメソッドを用意します。

このメソッドにコピー元を渡してあげればTで総称型で引数・戻り値を定義しているので、

同じ型で受けることができますね。

Serializableも実装できないときは?

この場合は、複製オブジェクトをnewして、地道にコピーといきそうですが、

apache.commonsのBeanUtilsを使用すれば、地道なコピーはかなり省力化できます。

BeanUtilsではBeanUtils.cloneBean(Object obj)か、

BeanUtils.copyProperties(dest, org)を使用すればOKです。

まとめ

と、いうことで色々なコピーの方法でした。

どんな場合でもコピーは可能だということはおわかりいただけたかと思います。

場面に応じて使い分けてみてくださいねー。

それでは!

ブログランキング・にほんブログ村へ
にほんブログ村


人気ブログランキング

20代前半までは東京で音楽をやりながら両手の指以上の業種でアルバイト生活をしていましたが、某大手プロバイダのテレアポのバイトでPCの知識の無さに愕然とし、コンピュータをもっと知りたい!と思ったことをきっかけに25歳の時にITの世界に未経験で飛び込みました。
紆余曲折を経て、現在は個人事業主としてお仕事させていただいており、10年ほどになります。
web制作から企業システム構築、ツール開発など、フロントエンドもバックエンドもサーバーもDBAも依頼があれば何でもやってきた雑食系エンジニアです。

今風にいうとフルスタックエンジニアということになるのかしら??

→ 詳細プロフィールというか、生い立ちはこちら

→スキルシートをご覧になる場合はこちら

→お仕事のご依頼やお見積りなどお問い合わせはこちらから!

シェアする

  • このエントリーをはてなブックマークに追加

フォローはいかがですか?