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


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


     

    原型模型简介

      原型模型:是指基于一个已经给定的对象,通过拷贝的方式,创建一个新的对象,这个给定对象,就是“原型”。在 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();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

     
    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;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

     

    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;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

     

    拷贝工厂

    浅拷贝

    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;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

     

    对比

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

  • 相关阅读:
    酷开科技打造更好体验服务用户
    php mysql 后台 操作
    又撸了一个开源项目!!!
    Double.doubleToLongBits()方法使用
    JAVA小游戏拼图
    易基因:细菌微生物基因表达调控表观研究方案|原核三代甲基化+转录组
    composer 安装和基本使用
    Golang中的闭包详解
    opt: undefined symbol when load
    Problem C: 算法10-10,10-11:堆排序
  • 原文地址:https://blog.csdn.net/weixin_54217216/article/details/125898116