import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
public class CloneTest implements Cloneable,Serializable {
private HashMap<String, String> map = null;
public CloneTest() {
map = new HashMap<String, String>();
map.put("red", "りんご");
map.put("green", "メロン");
map.put("yellow", "バナナ");
}
public Object cloneDeep() throws Exception {
byte[] byteArray = null;
//クローン元のオブジェクトをバイト配列へ
try(ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos)) {
oos.writeObject(this);
byteArray = baos.toByteArray();
}
//バイト配列からオブジェクトを再構成
Object retObject = null;
try(ByteArrayInputStream bais = new ByteArrayInputStream(byteArray);
ObjectInputStream ois = new ObjectInputStream(bais)) {
retObject = ois.readObject();
}
return retObject;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
for(Map.Entry<String, String> entry : map.entrySet()) {
sb.append(entry.getKey() + ":" + entry.getValue() + System.lineSeparator());
}
return sb.toString();
}
public static void main(String[] args) {
try {
//
//0.初期状態をそのまま出力
//
CloneTest test0 = new CloneTest();
System.out.println("===== 0.初期状態 =====");
System.out.println(test0.toString());
//
//1.Object#clone()でクローン作成→クローン元を加工
//
CloneTest test1 = new CloneTest();
CloneTest test1clone = (CloneTest)test1.clone();
test1.map.replace("green", "青りんご");
System.out.println("===== 1.Object#clone()でクローン作成 =====");
System.out.println("-- 1-1.クローン元 --");
System.out.println(test1.toString());
System.out.println("-- 1-1.クローン先 --");
System.out.println(test1clone.toString());
//
//2.CloneTest#cloneDeep()でクローン作成→クローン元を加工
//
CloneTest test2 = new CloneTest();
CloneTest test2clone = (CloneTest)test2.cloneDeep();
test2.map.replace("green", "青りんご");
System.out.println("===== 2.CloneTest#cloneDeep()でクローン作成 =====");
System.out.println("-- 2-1.クローン元 --");
System.out.println(test2.toString());
System.out.println("-- 2-1.クローン先 --");
System.out.println(test2clone.toString());
}catch(Exception e) {
e.printStackTrace();
}
}
}