【问题标题】:Cloning vs. Instantiating a new class克隆与实例化新类
【发布时间】:2011-04-12 01:53:49
【问题描述】:

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

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

【问题讨论】:

  • ' 在这种情况下?你能详细说明一下吗
  • 首先告诉我们为什么需要克隆这个对象。
  • 因为我想包装一个包含模型的集合。

标签: java cloning instances


【解决方案1】:

在 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());
}

【讨论】:

  • 你也可以有部分复制方法:public withBar(String newBar) { return new Foo(newBar, this.baz); }
  • 你的意思是静态工厂方法而不是工厂方法,这可能与工厂方法模式混淆
  • 那么应该避免原型模式吗?
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

    • 哦,修改克隆方法?这是必要的吗?我认为这只是一种类似于构造函数的方法,这也不是必需的。
    • 如果你没有在你的类中实现clone,当你调用它时你会得到一个CloneNotSupportedException
    【解决方案4】:

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

    这很容易出错。您必须小心地覆盖clone()。忘记调用super.clone() 是一个流行的错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-16
      • 2011-01-12
      • 2017-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多