使用对象克隆的正确方法是什么?

时间:2016-01-05 09:37:58

标签: java object cloning cloneable

这是我通过示例理解对象克隆的方式:

import java.util.GregorianCalendar;

public class CloneType1 {

  public static void main(String[] args) {
    GregorianCalendar obj = new GregorianCalendar();
    GregorianCalendar objCopy = (GregorianCalendar) obj.clone();

    System.out.println(obj.getTime());
    System.out.println(objCopy.getTime());
  }
}

使用这种实现克隆的方式有什么好处:

public class UsingCloneable implements Cloneable {
  int rollno;
  String name;

  public UsingCloneable(int rollno,String name) {
    this.rollno=rollno;
    this.name=name;
  }
  public Object clone()throws CloneNotSupportedException{
    return super.clone();
  }

  public static void main(String[] args) {
    try {
      UsingCloneable obj = new UsingCloneable(45, "SuperMan");
      UsingCloneable objCopy = (UsingCloneable) obj.clone();

      System.out.println(obj.name+"\t"+obj.rollno);
      System.out.println(objCopy.name+"\t"+objCopy.rollno);
    } catch (CloneNotSupportedException e) {
      e.printStackTrace();
    }
  }
}

1 个答案:

答案 0 :(得分:1)

  

使用这种实现克隆的方式有什么好处

在您的实现中返回Object.clone()(或super.clone())没有多大意义。你需要做的是创建所有可变字段的新实例,并将它们设置为你的新实例化对象的字段。让我们为您的示例添加一个字段:

public class UsingCloneable implements Cloneable {
   int rollno;
   String name;
   List list;

如果您没有深度克隆列表字段,则更改列表内容将同时应用于原始列表和克隆字段。这是可能的实现

public UsingCloneable clone()throws CloneNotSupportedException{
    UsingCloneable clone = new UsingCloneable (rollno, name);
    clone.list = new ArrayList(list);
    return clone;
}

基本上所有可变类型都需要深度克隆,否则你将在克隆之间共享它们的实例