• 原型模型(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 域的正常使用是不兼容的)。
    • 不会抛出受检异常。
    • 不需要类型转换。

  • 相关阅读:
    Linux篇 五、Ubuntu与Linux板卡建立NFS服务
    SpringBoot+Redis实现接口幂等性,就看这篇了
    python selenium 点击表格中的一系列按钮并输出弹窗内容到csv
    Java基础系列(六)——代理机制详解
    使用企业订货系统后的效果|软件定制开发|APP小程序搭建
    在Unity中用UGUI制作可输入下拉框
    对“Linux中遇到的RAID阵列”好好总结一次
    rust angular 自签名证书 wss
    Oracle Exadata-ASM异常导致数据库crash
    python 引用、浅拷贝、深拷贝
  • 原文地址:https://blog.csdn.net/weixin_54217216/article/details/125898116