我正在阅读Joshua Bloch的Effective Java,第2版,第11项:明智地覆盖克隆.
在第56页,他试图解释当我们覆盖clone()某些类(如集合类)时,我们必须复制它的内部.然后他给出了设计课程的例子Stack:
public class Stack {
private Object[] elements;
private int size = 0;
private static final int DEFAULT_INITIAL_CAPACITY = 16;
public Stack() {...}
public void push(Object e) {...}
public Object pop() {...}
private void ensureCapacity() {...} //omitted for simplicity
}
Run Code Online (Sandbox Code Playgroud)
他声称如果我们只是super.clone()用来克隆a Stack,那么生成的Stack实例"将在其size字段中具有正确的值,但是其elements字段将引用与原始Stack实例相同的数组.修改原始将破坏不变量克隆,反之亦然.您将很快发现您的程序产生无意义的结果或抛出NullPointerException." 现在看起来很公平.但他接着举了一个"正确实施"的例子,这让我很困惑:
@Override public Stack clone() {
try {
Stack result = (Stack) super.clone();
result.elements = elements.clone();
return result;
} catch (CloneNotSupportedException e) …Run Code Online (Sandbox Code Playgroud) java ×1