可以使用构造函数克隆方法创建对象

我一直认为clone()创建一个对象而不调用构造函数。

但是,在阅读Effective Java Item 11:明智地覆盖克隆时 ,我发现了一个声明

“没有被称为构造函数”的规定过于强大。 一个行为良好的克隆方法可以调用构造函数来创建正在构建的克隆内部的对象。 如果类是final,clone甚至可以返回由构造函数创建的对象。

有人可以向我解释一下吗?

我一直认为clone()创建一个对象而不调用构造函数。

Object.clone()实现不会调用构造函数。

没有什么可以阻止你以一种方式自己实现它。 例如,这是一个完全有效的clone()实现:

 public final class Foo implements Cloneable { private final int bar; public Foo(int bar) { this.bar = bar; } @Override public Object clone() { return new Foo(bar); } } 

如果类是final ,则只能(无条件地)执行此操作,因为这样可以保证返回与原始类型相同的对象。

如果该类不是final,我猜你可以检查实例是否“只是”覆盖clone()的类型的实例,并在不同的情况下以不同的方式处理它……但这样做会很奇怪。

我认为下面的部分代码总是创建新对象并提供给另一个类(即singleton中的helpl)。

  @Override public Object clone() { return new Foo(bar); } 

我认为这可以用于此目的:

 public MyObject clone() { return new MyObject(this); }