小编jus*_*eam的帖子

有效的Java声称elements.clone()就足够了

我正在阅读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

8
推荐指数
2
解决办法
181
查看次数

标签 统计

java ×1