9

在这种情况下克隆是好的做法吗?如何做得更好?

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;
}
4

4 回答 4

10

在 Java 中克隆很少是一个好主意。尝试其他技术,例如复制构造函数或工厂方法。

Wikipedia 有一篇很好的文章,介绍了为什么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());
}
于 2010-09-14T09:43:53.117 回答
2

您可以使用复制构造函数而不是实现Cloneable,但看起来您具有ModelEntry类层次结构,因此使用clone可能是最好的方法。请参阅此问题以获取有关问题所在的一些指示Cloneable

于 2010-09-14T09:44:05.057 回答
1

我认为,它就像编程中的其他一切一样:它取决于对象规范。

尝试做一个非常快速的测试:克隆 100000 个对象并实例化相同数量的对象并检查需要多长时间(System.currentTimeInMilis())。通常克隆更快。

请记住,使用克隆存在一个问题 - 添加新字段等时,您也需要修改 clone() 方法。

于 2010-09-14T09:38:31.917 回答
0

正如许多程序员所同意的那样,克隆并不是一个好主意。

它很容易出错。你必须clone()小心地重写。忘记调用super.clone()是一个流行的错误。

于 2010-09-14T10:03:04.790 回答