本文共 5214 字,大约阅读时间需要 17 分钟。
原型模式
2.浅复制与深复制
Java对象的浅层复制是指Java对象A本身被clone成新对象B,但A的属性没有被clone处理,只是把A的各个属性所指的对象赋值到B对应的属性上,A与B的相同属性都引用到同一个对象。
Java对象的深层复制是指Java对象A本身被clone成新对象B,同时A的属性也是被clone成新对象,赋值到A的各个属性上去,A与B的相同属性都引用到不同的对象。
在java中,默认是浅层复制的,如果要复制的对象中只含有基本数据类型和String类型,那么浅层复制和浅层复制是没有区别的,所以你可以放心的使用默认的浅层复制。
如果属性有Date或其他自定的数据类,则一定的小心了,因为这时浅层复制后对象B的属性birthday与原始对象A的对应属性birthday,都是引用到同一个对象TestVo ,如果通过B.birthday的方法改了TestVo的值,则修改会影响到A.birthday,这时也就会发生互串的情况
2.用应用于不同公司的简历为例
简历中会引用工作经历类,因此实现复制的时候不能用浅复制,而是用深复制。在java中克隆类要用到Cloneable接口,重写了Object的 clone() 方法。
浅复制代码结构图
package com.prototype;//工作经历类public class WorkExperience { private String workDate; private String company; public String getWorkDate() { return workDate; } public void setWorkDate(String workDate) { this.workDate = workDate; } public String getCompany() { return company; } public void setCompany(String company) { this.company = company; }}
package com.prototype;public class Resume implements Cloneable{ private String name; private String sex; private String age; private WorkExperience workExperience; //引用工作经历对象 public Resume(String name, String sex, String age) { this.name = name; this.sex = sex; this.age = age; this.workExperience=new WorkExperience(); } public String getName() { return name; } public void setName(String name) { this.name = name; } public void setSex(String sex) { this.sex = sex; } public void setAge(String age) { this.age = age; } public void setWorkExperience(String workDate,String company) { this.workExperience.setWorkDate(workDate); this.workExperience.setCompany(company); } //显示 public void Display(){ System.out.println("姓名:"+this.sex+",性别"+this.sex+",年龄"+this.age+",工作时间:"+this.workExperience.getWorkDate()+",工作地点:"+this.workExperience.getCompany()); } @Override protected Object clone() throws CloneNotSupportedException { Resume resume = null; try { resume = (Resume) super.clone(); } catch (Exception e) { e.printStackTrace(); } return resume; }}
package com.prototype;public class Client { public static void main(String[] args) throws CloneNotSupportedException { Resume r1=new Resume("小菜","男","23"); r1.setWorkExperience("2015-2019","ZZ企业"); Resume r2=(Resume) r1.clone(); r2.setWorkExperience("2019-2020","aa企业"); r1.Display(); r2.Display(); }}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-esQNAkmo-1619439528423)(image-20210426195814397.png)]
package com.prototype;public class Resume implements Cloneable{ private String name; private String sex; private String age; private WorkExperience workExperience; //引用工作经历对象 /** * 添加私有构造 克隆工作经历 * @param workExperience */ private Resume(WorkExperience workExperience) throws CloneNotSupportedException { this.workExperience= (WorkExperience) workExperience.clone(); } public Resume(String name, String sex, String age) { this.name = name; this.sex = sex; this.age = age; this.workExperience=new WorkExperience(); } public String getName() { return name; } public void setName(String name) { this.name = name; } public void setSex(String sex) { this.sex = sex; } public void setAge(String age) { this.age = age; } public void setWorkExperience(String workDate,String company) { this.workExperience.setWorkDate(workDate); this.workExperience.setCompany(company); } //显示 public void Display(){ System.out.println("姓名:"+this.sex+",性别"+this.sex+",年龄"+this.age+",工作时间:"+this.workExperience.getWorkDate()+",工作地点:"+this.workExperience.getCompany()); } //调用私有构造方法,让工作经历克隆完成,然后给这个简历对象相关字段赋值,最终返回一个深复制的简历对象、 @Override protected Object clone() throws CloneNotSupportedException { try { Resume resume = new Resume(this.workExperience);//调用私有构造器实现工作经历克隆 //给对象属性重新赋值--最终返回的是深复制的resume对象 resume.name=this.name; resume.sex=this.sex; resume.age=this.age; return resume; }catch (Exception e){ return null; } }}
package com.prototype;//工作经历类public class WorkExperience implements Cloneable { private String workDate; private String company; public String getWorkDate() { return workDate; } public void setWorkDate(String workDate) { this.workDate = workDate; } public String getCompany() { return company; } public void setCompany(String company) { this.company = company; } //工作经历类也是实现克隆方法 @Override protected Object clone() throws CloneNotSupportedException { try { return super.clone(); }catch (Exception e){ return null; } }}
转载地址:http://lpfdi.baihongyu.com/