原型模式
- 关于深拷贝和浅拷贝
java 8种基本数据类型及其包装类型, 以及String 类型都是深拷贝,其他数据类型为浅拷贝
- 关于重写Object 的clone接口
一般来说太麻烦,普通类还好,如果有引用类型的成员,成员也需要实现Clone接口,最好使用序列化的方式进行深拷贝
还有一个值得注意的地方Clone方法是protected修饰符修饰的, 包及子类可调用,所以说 无法直接调用String,clone();
使用序列化的方式(使用ByteArray反序列化)
public class SerialDeepClone {
public static <T> T deepClone(T origin) throws IOException, ClassNotFoundException {
ByteArrayOutputStream bao = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bao);
oos.writeObject(origin);
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bao.toByteArray());
ObjectInputStream ois = new ObjectInputStream(byteArrayInputStream);
return (T) ois.readObject();
}
public static void main(String[] args) throws IOException, ClassNotFoundException {
Student student1 = new Student();
student1.setName("aaa");
Student student2 = SerialDeepClone.deepClone(student1);
System.out.println(student1);
System.out.println(student2);
}
}