オブジェクトのコピー

3447 ワード

javaのオブジェクトコピーには、Serializableの実現と、Cloeableの実現の2つの方法があります。
 
どちらも対象のコピーが可能ですが、それぞれ長所と短所があります。
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();
    }
}