克隆与实例化新类

时间:2010-09-14 09:28:51

标签: java cloning instances

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

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 个答案:

答案 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

错误的一些指示,请参阅this question

答案 2 :(得分:1)

我觉得它与编程中的其他内容一样:它取决于对象的规格。

尝试进行快速测试: 克隆100000个对象并实例化相同数量的对象并检查时间(System.currentTimeInMilis())。克隆通常更快。

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

答案 3 :(得分:0)

克隆并不是一个好主意,因为很多程序员都同意。

这很容易出错。您必须仔细覆盖clone()。忘记调用super.clone()是一个受欢迎的错误。