根据Oracle的Javadoc,Object.clone()的通常惯例如下:
x.clone() != xx.clone().getClass() == x.getClass()x.clone().equals(x)通过调用super.clone()返回对象,可以帮助我们满足这些条件:
super.clone() 返回一个新对象实例super.clone() 返回调用clone()方法相同类型的对象实例Object.clone() 为对象状态执行影子复制比如,如下代码:
class BaseClass implements Cloneable {
@Override
public Object clone() throws CloneNotSupportedException { // Non-Compliant - should return the super.clone() instance
return new BaseClass();
}
}
class DerivedClass extends BaseClass implements Cloneable {
/* Does not override clone() */
public void sayHello() {
System.out.println("Hello, world!");
}
}
class Application {
public static void main(String[] args) throws Exception {
DerivedClass instance = new DerivedClass();
((DerivedClass) instance.clone()).sayHello(); // Throws a ClassCastException because invariant #2 is violated
}
}
应该重构为:
class BaseClass implements Cloneable {
@Override
public Object clone() throws CloneNotSupportedException { // Compliant
return super.clone();
}
}
class DerivedClass extends BaseClass implements Cloneable {
/* Does not override clone() */
public void sayHello() {
System.out.println("Hello, world!");
}
}
class Application {
public static void main(String[] args) throws Exception {
DerivedClass instance = new DerivedClass();
((DerivedClass) instance.clone()).sayHello(); // Displays "Hello, world!" as expected. Invariant #2 is satisfied
}
}