yuu_nkjm blog


2010-07-13(Tue) [長年日記]

[Java] Javaでapache.commons.lang.SerializationUtils.clone()を使ったディープコピー(Deep Copy)

ディープコピー(Deep Copy)とシャローコピー(Shallow Copy)の区別がつかずにやられるのは誰もが通る道.標準ライブラリを使って自前で実装するのもありだけど,apache.commons.lang.SerializationUtils.clone()を使うのが簡単っぽい.こちらのページには,シャローコピーの例も出ている.

deepCopy関数の内側でキャストするのも良いと思うけど,DataManagerクラス内で,いろんなオブジェクトのdeepCopyをしたかったので,キャストはdeepCopy関数の外側にした.これだと,SerializationUtils.clone()を直接呼ぶのと変わらないんだけど,何をしているかを自分にとって分かりやすくしたかった.

  import org.apache.commons.lang.SerializationUtils;
  import java.io.Serializable;
 
public class DataManager {
    private EleSimulationState simulationState;
    private List histories;
 
  public void finalizeSimulationState() {
    histories.add(simulationState);
    this.eleSimulationState = (SimulationState) deepCopy(this.simulationState);
  }
 
  public Object deepCopy(Serializable state) {
    Object dest = SerializationUtils.clone(state);
    return dest;
  }
}

cloneする対象はSerializableをimplementsする.

public class SimulationState implements Serializable{
  private Map<Id, Facility> facilities;
  private Map<Id, Vehicle> vehicles;
}

cloneする対象のメンバ変数に含まれるクラスはSerializableをimplements(interface定義ならextends)する.

public interface Facility extends Serializable{}
public interface Vehicle extends Serializable{}

シリアライズ(直列化)の対象から外したいメンバ変数には,transientという修飾子をつける.

参考文献

  1. 2007-06-10 [Java]1行でシャローコピー/ディープコピー - 現場のためのソフトウェア開発プロセス - たかのり日記

XStreamを使ったdeep copy

com.thoughtworks.xstream.XStreamというライブラリでもディープコピーが出来るらしい.以下のページには,「XStreamなら、対象のオブジェクトがSerializableを実装していなくても書き出せるのがポイントですね。」と書かれている.

  1. XStreamを利用して簡単にディープコピー - kaisehのブログ
本日のリンク元
その他のリンク元
検索

トップ «前の日記(2010-07-12(Mon)) 最新 次の日記(2010-07-14(Wed))» 月表示 編集 設定
2006|01|06|12|
2007|06|09|
2008|01|03|04|06|07|08|09|10|12|
2009|01|02|05|06|07|08|10|11|12|
2010|03|04|05|06|07|08|09|10|11|
2011|01|02|03|04|05|06|07|08|09|11|12|
2012|01|02|04|06|07|08|10|11|12|
2013|01|02|03|07|08|10|11|12|
2014|01|02|04|05|06|07|08|09|10|11|
2015|01|02|07|11|12|
2016|01|03|05|07|08|09|