克隆是否比构造函数/工厂方法提供了性能改进?

sk.*_*sk. 7 java optimization clone cloneable

我正在维护一个较旧的Java代码库(jvm 1.4),它似乎使用克隆作为对象实例化的替代方案,我猜测它是一种性能优化.这是一个人为的例子:

public class Foo {
  private SomeObject obj; // SomeObject implements Cloneable
  public Foo() {
    obj = new SomeObject();
    obj.setField1("abc"); // these fields will have the same value every time
    obj.setField2("def");
  }
  public void doStuff() {
    SomeObject newObj = obj.clone(); // clone it instead of using a factory method
    // do stuff with newObj
  }
}
Run Code Online (Sandbox Code Playgroud)

关于过早优化的常见警告尽管如此,这实际上是一个推荐的成语吗?

Der*_*har 3

调用clone()而不是复制构造函数或工厂方法的原因之一是其他选项可能都不可用。

与实现clone()复制构造函数或工厂方法来执行相同操作相比,实现执行浅对象复制(更涉及深度复制)是微不足道的。要实现clone(),类只需实现接口并用通常调用的Cloneable方法重写方法。 将原始对象的每个属性复制到副本的相应属性中,从而创建浅副本。clone()super.clone()Object.clone()Object.clone()

尽管实施clone()很简单,但仍然很容易忘记实施Cloneableclone()因此,使用复制对象的潜在风险是,如果该对象的类确实忽略了实现Cloneable并直接或间接clone()调用,它将抛出。Object.clone()CloneNotSupportedException

请参阅此代码示例和之前关于界面设计不佳的讨论Cloneable