原型模型(clone()和拷贝构造器之间的选择)

本文探讨了Java中的原型模式,重点讲解了Object的clone()方法的应用,包括浅拷贝与深拷贝示例,并剖析了Sonar测试中关于使用拷贝构造器和拷贝工厂的建议。同时,对比了不同复制方式的优缺点和适用场景。
摘要由CSDN通过智能技术生成

❤ 作者主页:李奕赫揍小邰的博客
❀ 个人介绍:大家好,我是李奕赫!( ̄▽ ̄)~*
🍊 记得点赞、收藏、评论⭐️⭐️⭐️
📣 认真学习!!!🎉🎉


 

原型模型简介

  原型模型:是指基于一个已经给定的对象,通过拷贝的方式,创建一个新的对象,这个给定对象,就是“原型”。在 Java 中,原型模式体现为 Object 的 clone() 方法。所有类都可以通过实现 Cloneable 接口,以及重写 clone() 方法,来实现原型模式。

 

Object 的 clone() 方法

clone浅拷贝:

public class Library implements Cloneable {
    private String id;
    private String name;
    private String category;

    @Override
    public Library clone() throws CloneNotSupportedException {
        return (Liability) super.clone();
    }
}

 
clone深拷贝

public class PolicyDeepClone implements Cloneable {

    private String code;
    private int applicantAge;
    private Liability liability;
    private List<String> specialDescriptions;

    @Override
    public PolicyDeepClone clone() throws CloneNotSupportedException {
        PolicyDeepClone clone = (PolicyDeepClone) super.clone();
        clone.specialDescriptions = new ArrayList<>(this.specialDescriptions);
        clone.liability = this.liability.clone();
        return clone;
    }
}

 

clone()方法sonar测试报错

  当我们实现了 clone() 方法,在编译器中,还会看到一条 Blocker 级别的 Sonar 警告:Remove this “clone” implementation; use a copy constructor or copy factory instead.它推荐的是一个拷贝构造器和拷贝工厂。

 

拷贝构造器

浅拷贝

public final class PolicyCopyConstructor {

    private String code;
    private int applicantAge;
    private Liability liability;
    private List<String> specialDescriptions;

    public PolicyCopyConstructor(PolicyCopyConstructor policy) {
        this.code = policy.code;
        this.applicantAge = policy.applicantAge;
        this.liability = policy.liability;
        this.specialDescriptions = policy.specialDescriptions;
    }
}

 

拷贝工厂

浅拷贝

public final class PolicyCopyFactory {

    private String code;
    private int applicantAge;
    private Liability liability;
    private List<String> specialDescriptions;

    public static PolicyCopyFactory newInstance(PolicyCopyFactory policy) {
        PolicyCopyFactory copyPolicy = new PolicyCopyFactory();
        copyPolicy.setCode(policy.getCode());
        copyPolicy.setApplicantAge(policy.getApplicantAge());
        copyPolicy.setLiability(policy.getLiability());
        copyPolicy.setSpecialDescriptions(policy.getSpecialDescriptions());
        return copyPolicy;
    }
}

 

对比

  • List item不依赖于某一种带有风险的,语言之外的对象创建机制(clone 是 native 方法)。
  • 不会与 final 域的正常使用发生冲突(clone 架构与引用可变对象的 final 域的正常使用是不兼容的)。
  • 不会抛出受检异常。
  • 不需要类型转换。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李奕赫揍小邰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值