我在 Java 中实现 clone() 时快速搜索了一下,发现: http://www.javapractices.com/topic/TopicAction.do?Id=71
它有以下评论:
copy constructors and static factory methods provide an alternative to clone, and are much easier to implement.
我只想做一个深拷贝。实现 clone() 似乎很有意义,但是这篇 google 排名很高的文章让我有点害怕。
以下是我注意到的问题:
复制构造函数不适用于泛型。
这是一些无法编译的伪代码。
public class MyClass<T>{
..
public void copyData(T data){
T copy=new T(data);//This isn't going to work.
}
..
}
示例 1:在泛型类中使用复制构造函数。
工厂方法没有标准名称。
有一个可重用代码的接口(interface)真是太好了。
public class MyClass<T>{
..
public void copyData(T data){
T copy=data.clone();//Throws an exception if the input was not cloneable
}
..
}
示例 2:在泛型类中使用 clone()。
我注意到 clone 不是一个静态方法,但是是否仍然需要对所有 protected 字段进行深拷贝?在实现 clone() 时,在不可克隆子类中引发异常的额外工作对我来说似乎微不足道。
我错过了什么吗?任何见解将不胜感激。
最佳答案
基本上,clone is broken .没有什么可以轻松地使用泛型。如果你有这样的事情(缩短以了解重点):
public class SomeClass<T extends Copyable> {
public T copy(T object) {
return (T) object.copy();
}
}
interface Copyable {
Copyable copy();
}
然后通过编译器警告,您可以完成工作。因为泛型在运行时被删除,所以复制的东西会在其中产生编译器警告。 在这种情况下是无法避免的。。在某些情况下是可以避免的(感谢 kb304),但并非完全如此。考虑您必须支持实现接口(interface)的子类或未知类的情况(例如,您正在遍历不一定生成相同类的可复制集合)。
关于java - 克隆() vs 复制构造函数 vs 工厂方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1106102/