オブジェクトのコピー
3447 ワード
javaのオブジェクトコピーには、Serializableの実現と、Cloeableの実現の2つの方法があります。
どちらも対象のコピーが可能ですが、それぞれ長所と短所があります。
1.Clone eableを実現するには、cloneメソッドのコピーオブジェクトは非常に簡単である必要がありますが、これは元のオブジェクトに侵入するので、オブジェクトの拡張に不利です。新しいオブジェクトが引き継ぎClone eableを実現するオブジェクトがあると、新しいオブジェクトをコピーするには、clone()メソッドを書き換えなければなりません。
2.Serializableの複製対象を実現するには、方法が比較的複雑であり、ByteArayOutputStream、Object OutputStream、ByteArayInputStream、Object InputStreamなどが必要ですが、侵入性はありません。
どちらも対象のコピーが可能ですが、それぞれ長所と短所があります。
1.Clone eableを実現するには、cloneメソッドのコピーオブジェクトは非常に簡単である必要がありますが、これは元のオブジェクトに侵入するので、オブジェクトの拡張に不利です。新しいオブジェクトが引き継ぎClone eableを実現するオブジェクトがあると、新しいオブジェクトをコピーするには、clone()メソッドを書き換えなければなりません。
2.Serializableの複製対象を実現するには、方法が比較的複雑であり、ByteArayOutputStream、Object OutputStream、ByteArayInputStream、Object InputStreamなどが必要ですが、侵入性はありません。
package com.sg.deepcopy;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
/**
* <b>DeepCopy.java</b>
* @author yanlei
* @version 1.0 Jun 9, 2012
*/
public class DeepCopy {
public static Object streamCopy(Object obj) throws IOException, ClassNotFoundException{
//
ByteArrayOutputStream out = new ByteArrayOutputStream();
ObjectOutputStream objOut = new ObjectOutputStream(out);
//
objOut.writeObject(obj);
objOut.flush();
objOut.close();
//
ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray());
ObjectInputStream objIn = new ObjectInputStream(in);
//
return objIn.readObject();
}
public static CloneUser cloneCopy(CloneUser user) throws CloneNotSupportedException {
return (CloneUser) user.clone();
}
public static void main(String[] args) throws IOException, ClassNotFoundException, CloneNotSupportedException {
System.out.println("// ");
User user1 = new User("zhangsan");
System.out.println("user1 hash " +user1);
User user2 = (User)streamCopy(user1);
System.out.println("user2 hash " +user2);
System.out.println("// clone ");
CloneUser cloneUser1 = new CloneUser("lisi");
System.out.println("cloneUser1 hash " +cloneUser1);
CloneUser cloneUser2 = cloneCopy(cloneUser1);
System.out.println("cloneUser2 hash " +cloneUser2);
}
}
class User implements Serializable{
public User(){}
public User(String name) {
this.name = name;
}
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
class CloneUser implements Cloneable {
public CloneUser(){}
public CloneUser(String name) {
this.name = name;
}
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}