有关对象的克隆克隆的方法

有关对象的克隆,目前有两种方式。 1.实现Cloneable接口并重写Object类中的clone(),方法; 这里的实现方法比较简单,就是用该类中已有的参数变量去构造一个参数相同的新对象。这个克隆出来的对象,各种参数值相同,但是地址值是不同的。但是有一点,这种类多数需要带有所有参数的构造方法使用起来不叫简单。 2.实现Seriable接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深度克隆。

首先这个是要有一个工具类,工具类的参数为被克隆对象,返回值为克隆的新对象

public class MyUtil {

    private MyUtil() {
        throw new AssertionError();
    }
    //这里需要注意泛型的使用
    public static <T> T clone(T obj) throws Exception {
        ByteArrayOutputStream bout = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(bout);
        oos.writeObject(obj);

        ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
        ObjectInputStream ois = new ObjectInputStream(bin);
        return (T) ois.readObject();

        // 说明:调用ByteArrayInputStream或ByteArrayOutputStream对象的close方法没有任何意义
        // 这两个基于内存的流只要垃圾回收器清理对象就能够释放资源,这一点不同于对外部资源(如文件流)的释放
    }
}

我们一般使用第二种,因为基于序列化和反序列化实现的克隆不仅仅是深度克隆,更重要的是通过泛型限定,可以检查出要克隆的对象是都支持序列化,折现个检查是编译器完成的,不是在运行时排除异常,这种方案明显比Object的clone方法好,把问题在编译是暴露,而不是运行时。

猜你喜欢

转载自my.oschina.net/u/3045515/blog/1596104