• 【转】java中的clone


    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。

  • 相关阅读:
    笔记-JavaWeb学习之旅13
    笔记-JavaWeb学习之旅12
    笔记-JavaWeb学习之旅11
    笔记-JavaWeb学习之旅10
    EF Core CodeFirst
    C#泛型
    软件工程笔记(二)
    第一章 软件工程概述
    软件工程笔记(一)
    MySql笔记(二)
  • 原文地址:https://www.cnblogs.com/seven7seven/p/4201097.html
Copyright © 2020-2023  润新知