【发布时间】:2015-04-27 20:10:42
【问题描述】:
我试图了解 java 中的 clone() 方法下面发生了什么,我想知道如何比进行新调用更好
public class Person implements Cloneable {
private String firstName;
private int id;
private String lastName;
//constructors, getters and setters
@Override
protected Object clone() throws CloneNotSupportedException {
Person p = (Person) super.clone();
return p;
}
}
这是我的克隆代码,我想知道下面发生了什么,以及新调用之间的区别是什么。
这是我的客户代码
Person p = new Person("John", 1, "Doe");
Person p2 = null;
try {
p2 = (Person) p.clone();
} catch (CloneNotSupportedException ex) {
Logger.getLogger(clientPrototype.class.getName()).log(Level.SEVERE, null, ex);
}
p2.setFirstName("Jesus");
System.out.println(p);
System.out.println(p2);
【问题讨论】:
-
为什么你认为 clone() 比创建对象的性能更好?这不是真的。
-
首先使用
clone()也是not a good的想法。 -
你会用什么来代替克隆,还有,为什么真正的克隆没有更好的性能?
-
.clone()的一个与性能无关的优势(假设它在下面使用Object.clone())是它生成一个与调用它的对象具有相同运行时类的对象,而如果你使用new,您将在编译时硬编码您正在创建的对象的类,这可能与对象的确切运行时类不同(对象的类可以是编译时类型的子类指向它的变量)。 -
一如既往地谈论
clone,尽量不惜一切代价避免。这是一个损坏的功能,非常容易引入错误并且极难实现正确。并且更难通过适当的继承来维护正确的实现(Effective Java 对此主题有很好的阅读)。有更安全和更好的方法来创建副本。例如,通过向您的类引入 复制构造函数。
标签: java performance clone cloneable