原型模式

本文介绍了Java中的深拷贝和浅拷贝概念,强调了基本类型和String的拷贝特性。对于复杂对象的深拷贝,通过重写Object的clone方法可能较为繁琐,尤其是涉及引用类型成员时。文章推荐使用序列化方式实现深拷贝,提供了一个示例代码,展示了如何利用ByteArrayOutputStream和ObjectInputStream进行对象的深拷贝操作。
摘要由CSDN通过智能技术生成

原型模式

  • 关于深拷贝和浅拷贝

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);
   }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值