在这种情况下克隆是好的做法吗?怎么做得更好?
public ModelCollection startParsing() {
return parseFeed(new ModelSpecialEntry);
}
public ModelCollection parseFeed(ModelEntry pattern) {
ModelCollection modelCollection = new ModelCollection();
while( condition ) {
//TODO: Is cloning the best solution?
ModelEntry model = (ModelEntry) pattern.clone();
model.parse();
//add this item to an collection
modelCollection.add(model);
}
return modelCollection;
}
答案 0 :(得分:10)
克隆在Java中很少是一个好主意。尝试其他技术,如复制构造函数或工厂方法。
维基百科a nice article解释了为什么clone()
在Java中有许多缺点。
使用复制构造函数,创建一个构造函数,该构造函数将当前类的实例作为参数,并复制本地类中的所有字段:
public class Foo {
private String bar;
private String baz;
public Foo(Foo other) {
this.bar = other.bar;
this.baz = other.baz;
}
}
使用工厂方法,创建一个方法,将对象作为参数并返回包含相同值的对象:
public Foo copyFoo(Foo other) {
Foo foo = new Foo();
foo.setBar(other.getBar());
foo.setBaz(other.getBaz());
}
答案 1 :(得分:2)
您可以使用复制构造函数而不是实现Cloneable
,但看起来您拥有ModelEntry
类的层次结构,因此使用clone
可能是最佳方法。有关Cloneable
答案 2 :(得分:1)
我觉得它与编程中的其他内容一样:它取决于对象的规格。
尝试进行快速测试: 克隆100000个对象并实例化相同数量的对象并检查时间(System.currentTimeInMilis())。克隆通常更快。
请记住,克隆有一个问题 - 添加新字段等时,您也需要修改clone()方法。
答案 3 :(得分:0)
克隆并不是一个好主意,因为很多程序员都同意。
这很容易出错。您必须仔细覆盖clone()
。忘记调用super.clone()
是一个受欢迎的错误。