将对象复制到另一个

时间:2010-03-29 09:23:56

标签: java

是否有通用的方法来将现有对象复制到另一个对象中?

假设MyObjidname个字段。像这样:

MyObj myObj_1 = new MyObj(1, "Name 1");
MyObj myObj_2 = new MyObj(2, "Name 2");

而不是

myObj_2.setName(myObj_1.getName()) // etc for each field

执行以下操作:

myObj_2.copyFrom(myObj_1)

因此它们是不同的实例,但具有相同的属性。

6 个答案:

答案 0 :(得分:8)

约定是在构造时使用构造函数执行此操作,该构造函数采用其自己类型的一个参数。

MyObj myObj_2 = new MyObj(myObj_1);

没有Java约定来覆盖另一个对象的现有属性。这往往违背了Java中对不可变对象的偏好(除非有充分的理由,否则在构造时设置属性)。

编辑:关于clone(),许多工程师在现代Java中不鼓励这样做,因为它已经过时了语法和其他缺点。 http://www.javapractices.com/topic/TopicAction.do?Id=71

答案 1 :(得分:7)

使用复制构造函数:

public class YourObject {
  private String name;
  private int age;

  public YourObject(YourObject other) {
     this.name = other.name;
     this.age = other.age;
  }
}

答案 2 :(得分:4)

答案 3 :(得分:0)

clone() - 方法正是为了完成这项工作。

答案 4 :(得分:0)

您可以使用内省来自动执行克隆例程,这样您就可以安全地忘记复制某些字段。

答案 5 :(得分:0)

clone()方法最适合这些要求。每当在对象上调用clone()方法时,JVM实际上将创建一个新对象,并将先前对象的所有内容复制到新创建的对象中。在使用clone()方法之前,您必须实现Cloneable接口并覆盖clone()方法。

public class CloneExample implements Cloneable
{
    int id;
    String name;

    CloneExample(int id, String name) {
        this.id = id;
        this.name = name;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }

    public static void main(String[] args) {
        CloneExample obj1 = new CloneExample(1,"Name_1");

        try {
            CloneExample obj2 = (CloneExample) obj1.clone();
            System.out.println(obj2.id);
            System.out.println(obj2.name);
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
    }
}