是否有通用的方法来将现有对象复制到另一个对象中?
假设MyObj
有id
和name
个字段。像这样:
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)
因此它们是不同的实例,但具有相同的属性。
答案 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();
}
}
}