オブジェクトのコピーについて
シャローコピー
シャローコピー(浅いコピー)はコピー先のオブジェクトに対し、そのオブジェクトの参照情報のみ複写する
Item item1 = new Item();
Item item2 = item1;
item2.setData("this is item2");
item1.setData("this is item1");
System.out.println(item2.getData());
Item item2 = item1;
item2.setData("this is item2");
item1.setData("this is item1");
System.out.println(item2.getData());
実行結果
shell > this is item1
ディープコピー
ディープコピー(深いコピー)はコピー先のオブジェクトに対し、そのオブジェクトの参照情報だけでなくオブジェクトの実体も複写する
オブジェクトをディープコピーする方法例(シリアライズを使用)
package org.dyndns.rhmusic;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
/**
* オブジェクトの複製を定義するクラス
* @author Paradigm-Shift
*/
public class ObjectCopier {
/**
* オブジェクトのディープコピーを返す
* @param serializableを実装したコピー元のObject
* @return Objectのコピー
* @throws IOException
* @throws ClassNotFoundException
*/
public static Serializable copy(final Serializable serializable) throws IOException, ClassNotFoundException{
if (serializable == null) {
return null;
}
final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
final ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
objectOutputStream.writeObject(serializable);
objectOutputStream.close();
final byte[] bytes = byteArrayOutputStream.toByteArray();
final ObjectInputStream objectInputStream = new ObjectInputStream(new ByteArrayInputStream(bytes));
final Object copyObject = objectInputStream.readObject();
objectInputStream.close();
return (Serializable) copyObject;
}
}
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
/**
* オブジェクトの複製を定義するクラス
* @author Paradigm-Shift
*/
public class ObjectCopier {
/**
* オブジェクトのディープコピーを返す
* @param serializableを実装したコピー元のObject
* @return Objectのコピー
* @throws IOException
* @throws ClassNotFoundException
*/
public static Serializable copy(final Serializable serializable) throws IOException, ClassNotFoundException{
if (serializable == null) {
return null;
}
final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
final ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
objectOutputStream.writeObject(serializable);
objectOutputStream.close();
final byte[] bytes = byteArrayOutputStream.toByteArray();
final ObjectInputStream objectInputStream = new ObjectInputStream(new ByteArrayInputStream(bytes));
final Object copyObject = objectInputStream.readObject();
objectInputStream.close();
return (Serializable) copyObject;
}
}
本来ファイルに書き出すところを一旦ByteArrayOutputStreamに書き出し、それをもう一度読み込んでいる。ただ、実行速度が遅い。
JUtilsなどを使ってコピーコンストラクタを作ったほうが早いかも