当前位置: 首页 > news >正文

南宁市网站开发公司电话百度一下首页百度一下

南宁市网站开发公司电话,百度一下首页百度一下,微商城建设购物网站,粉色的网站原型模式: 原型模式,是指基于一个已经给定的对象,通过拷贝的方式,创建一个新的对象,这个给定对象,就是“原型”。 在 Java 中,原型模式体现为 Object 的 clone() 方法。 所有类都可以通过实现 C…
  • 原型模式: 

  原型模式,是指基于一个已经给定的对象,通过拷贝的方式,创建一个新的对象,这个给定对象,就是“原型”。

  在 Java 中,原型模式体现为 Object 的 clone() 方法。

  所有类都可以通过实现 Cloneable 接口,以及重写 clone() 方法,来实现原型模式。

  

  • 代码:
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Liability implements Cloneable {private String code;private String name;private String category;private boolean isMajor;@Overrideprotected Liability clone() throws CloneNotSupportedException {return (Liability) super.clone();}
}
@Data
@Builder
public class PolicyShallowClone implements Cloneable {private String code;private int applicantAge;private Liability liability;private List<String> specialDescriptions;@Overridepublic PolicyShallowClone clone() throws CloneNotSupportedException {return (PolicyShallowClone) super.clone();}
}

 

  • 缩减 clone() 方法的返回类型:

  自 JDK1.5 开始,Java 引进了一个新的特性:协变返回类型(covariant return type)。

  即:覆盖方法的返回类型,可以是被覆盖方法的返回类型的子类。

  所以需要在 clone() 方法内部进行强转。

  这体现了一条通则:永远不要让客户去做任何类库能够替客户完成的事情。

 

  • clone() 是一种浅度复制(Shallow Copy):
    @Testvoid testPolicy1() throws Exception {// Build original policyLiability liability = new Liability.LiabilityBuilder().code("0001").name("Liability").category("XPXA").build();String specialDescription1 = "text1";String specialDescription2 = "text2";List<String> specialDescriptions = new ArrayList<>(Arrays.asList(specialDescription1, specialDescription2));PolicyShallowClone policyA = PolicyShallowClone.builder().specialDescriptions(specialDescriptions).liability(liability).code("code001").applicantAge(18).build();// Call clonePolicyShallowClone policyB = policyA.clone();Assertions.assertSame(policyA.getCode(), policyB.getCode());Assertions.assertEquals(policyA.getCode(), policyB.getCode());// Assert shallow clonepolicyA.getSpecialDescriptions().add("text3");Assertions.assertSame(policyA.getLiability(), policyB.getLiability());Assertions.assertTrue(policyA.getSpecialDescriptions().size() == policyB.getSpecialDescriptions().size());}

 

  • 编写一个优秀的 clone() 方法:

  克隆对象的数据来源,必须来自于 clone() 方法,所以永远在方法内部调用 super.clone() 方法。

  所有的父类必须很好地实现了 clone() 方法。

  如果当前类包含的域引用了可变对象,需要递归地调用 clone() 方法。

  如果在线程安全的类中实现 Cloneable 接口,clone() 方法必须得到很好的同步。

 

  • 一个深度复制的 clone() 方法:
@Data
@Builder
public class PolicyDeepClone implements Cloneable {private String code;private int applicantAge;private Liability liability;private List<String> specialDescriptions;@Overridepublic PolicyDeepClone clone() throws CloneNotSupportedException {PolicyDeepClone clone = (PolicyDeepClone) super.clone();clone.specialDescriptions = new ArrayList<>(this.specialDescriptions);clone.liability = this.liability.clone();return clone;}
}

 

  • 深度复制的测试:
    @Testvoid testPolicy2() throws Exception {// Build original policyLiability liability = new Liability.LiabilityBuilder().code("0001").name("Liability").category("XPXA").build();String specialDescription1 = "text1";String specialDescription2 = "text2";List<String> specialDescriptions = new ArrayList<>(Arrays.asList(specialDescription1, specialDescription2));PolicyDeepClone policyA = PolicyDeepClone.builder().specialDescriptions(specialDescriptions).liability(liability).code("code001").applicantAge(18).build();// Call clonePolicyDeepClone policyB = policyA.clone();// Assert deep clonepolicyA.getSpecialDescriptions().add("text3");Assertions.assertNotSame(policyA.getLiability(), policyB.getLiability());Assertions.assertFalse(policyA.getSpecialDescriptions().size() == policyB.getSpecialDescriptions().size());}

 

  • 有必要这么复杂吗?

  从上述的介绍,我们不难发现,要完成一个优秀的 clone() 方法,存在诸多限制。

  并且,当我们实现了 clone() 方法,在编译器中,还会看到一条 Blocker 级别的 Sonar 警告:

  Remove this "clone" implementation; use a copy constructor or copy factory instead.

  它推荐的是一个拷贝构造器和拷贝工厂。

 

  • 拷贝构造器(Copy constructor)
@Data
@Builder
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;}
}

 

  显然,这是一个浅度复制的实现,如果需要深度复制,需要深一步挖掘,这里不详述。

 

  • 拷贝工厂(Copy factory):
@Data
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;}
}

 

  拷贝工厂本质上使我们之前提到过的静态工厂的一种变形。

  在这里,这也是浅度复制的实现。

 

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

 

  • 《Effective Java》 第11条:谨慎地覆盖 clone

  鉴于 clone() 方法存在这么多限制,《Effective Java》明确指出:

  除了拷贝数组,其他任何情况都不应该去覆盖 clone() 方法,也不该去调用它。

 

  • 关于深复制:

  这篇文章 第004弹:几种通用的深度复制的方法 介绍了几种深复制的通用方法。

 

转载于:https://www.cnblogs.com/jing-an-feng-shao/p/7594680.html

http://www.lbrq.cn/news/2681731.html

相关文章:

  • 凡客网站建设正规微商免费推广软件
  • 织梦模板大气网站建设类网站模板公司网络营销推广方案
  • 网站建设网站软件有哪些内容seo技巧课程
  • 网站技术制作流程图冯站长之家
  • 企业微网站爱站网站seo查询工具
  • 横岗网站建设多少钱网络推广公司哪家好
  • 网站搜索不出来怎么进行seo
  • 网站目录 index营销宣传方式有哪些
  • 大兴快速网站建设哪家好在线培训考试系统
  • 网站建设违法行为网站建设与管理属于什么专业
  • 网站上图怎么用ps做百度推广系统营销平台
  • 做网站公司汉狮团队app投放推广
  • 如何做p2p网站网络推广员要怎么做
  • 简单网站建设seo优化文章网站
  • 软文营销把什么放在第一位沈阳seo公司
  • wordpress 文本小工具编辑器windows优化大师免费
  • 营销型企业网站分析与诊断快速排名生客seo
  • 网站建设需求说明百度网盘链接
  • 手机百度搜索重庆seo服务
  • 二手设备回收做哪个网站好北京专业网站优化
  • 网站如何做优化排名靠前磁力下载
  • 网站制作滚动图片怎么做广告联盟怎么赚钱
  • 你好南京网站怎么做好推广和营销
  • 静态网站源码下载搜索引擎营销成功案例
  • 网站建设深圳公司搜索营销
  • 中国互联网协会副会长名单百度seo规则最新
  • 做外汇看新闻在什么网站看举出最新的网络营销的案例
  • 中英文网站建设需要懂英语吗广州中小企业seo推广运营
  • 淘宝客网站域名聊城今日头条最新
  • 河南省建设工程网站镇江seo优化
  • 下一代防火墙技术
  • 【k8s】k8s安装与集群部署脚本
  • 关于微信小程序的笔记
  • STM32 HAL驱动MPU6050传感器
  • MariaDB 数据库管理
  • I2CHAL库接口