java中的clone

Clone&Copy

假设现在有一个Employee对象,Employee tobby =new Employee(“CMTobby”,5000),通常我们会有这样的赋值Employee cindyelf=tobby,这个时候只是简单了copy了一下reference,cindyelf和tobby都指向内存中同一个object,这样cindyelf或者tobby的一个操作都可能影响到对方。打个比方,如果我们通过cindyelf.raiseSalary()方法改变了salary域的值,那么tobby通过getSalary()方法得到的就是修改之后的salary域的值,显然这不是我们愿意看到的。我们希望得到tobby的一个精确拷贝,同时两者互不影响,这时候我们就可以使用Clone来满足我们的需求。Employee cindy=tobby.clone(),这时会生成一个新的Employee对象,并且和tobby具有相同的属性值和方法。

Shallow Clone&Deep Clone

Clone是如何完成的呢?Object在对某个对象实施Clone时对其是一无所知的,它仅仅是简单地执行域对域的copy,这就是Shallow Clone。这样,问题就来了咯,以Employee为例,它里面有一个域hireDay不是基本型别的变量,而是一个reference变量,经过Clone之后就会产生一个新的Date型别的reference,它和原始对象中对应的域指向同一个Date对象,这样克隆类就和原始类共享了一部分信息,而这样显然是不利的,过程下图所示:

这个时候我们就需要进行deep Clone了,对那些非基本型别的域进行特殊的处理,例如本例中的hireDay。我们可以重新定义Clone方法,对hireDay做特殊处理,如下代码所示:

   class Employee implements Cloneable{
public Object clone() throws CloneNotSupportedException{
Employee cloned = (Employee) super.clone();
cloned.hireDay = (Date) hireDay.clone()
return cloned;
}
}

需要注意的是Class A存在更为复杂的成员变量时,如Vector等存储对象地址的容器时,就必须clone彻底。

public class A implements Cloneable {
public String name[];
public Vector<B> claB; public A(){
name=new String[2];
claB=new Vector<B>();
} public Object clone() {
A o = null;
try {
o = (A) super.clone();
o.name==(String[])name.clone();//深度clone
o.claB=new Vector<B>();//将clone进行到底
for(int i=0;i<claB.size();i++){
B temp=(B)claB.get(i).clone();//当然Class B也要实现相应clone方法
o.claB.add(temp);
}
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return o;
}
}

总结:当Class A成员变量类型是java的基本类型时(外加String类型),只要实现如上简单的clone(称影子clone)就可以。但是如果Class A成员变量是数组或复杂类型时,就必须实现深度clone。

最新文章

  1. Autofac
  2. mongodb权限管理
  3. JavaWeb学习总结-01 JavaWeb开发入门
  4. ServiceManager: Permmission failure: android.permission.RECORD_AUDIO
  5. 【leetcode】Path Sum I &amp; II(middle)
  6. FastPolice项目总结
  7. android:LayoutInflater
  8. POJ 1195 Mobile phones(二维树状数组)
  9. hdu 3746 Cyclic Nacklace(KMP)
  10. ExtJS4.2学习(九)属性表格控件PropertyGrid(转)
  11. 老司机带路——15个Android撸代码常见的坑
  12. get请求URL的转码
  13. 【EMV L2】Cardholder Verification Rule(CVR) Format
  14. 浅析H5图片上传
  15. Fix Python 3 on Windows error Microsoft Visual C++ 14.0 is required
  16. 学习笔记:Stage.js(又叫Cut.js)——2D canvas 开发库,游戏方面的
  17. curl命令行
  18. mockery expectation 覆盖
  19. luogu P3978 [TJOI2015]概率论
  20. CAT Caterpillar ET is really a exceptional obd2 solution

热门文章

  1. Count Different Palindromic Subsequences
  2. 网站循环加载监控-C#
  3. CSP 通信网络(201709-4)
  4. MySQL5.7主从-GTID-mysqldump,xtrabackup搭建
  5. Jmeter之TCP取样器(模拟数据上报压测)
  6. 【题解】JSOI2008 最大数
  7. O039、Unshelve Instance 操作详解
  8. 【Swift后台】环境安装
  9. php使用rdkafka进行消费
  10. odoo字段属性