java深拷贝通过拷贝构造函数

时间:2012-11-23 01:36:07

标签: java copy-constructor deep-copy

我想要做的是定义一个复制构造函数 将A作为参数,并将新A初始化为深度 参数A的副本

public class A<E extends Comparable<? super E>> implements B<E> 
{
    private A a;
    private E[] hArray;

    // What I tried .... my copy constructor

    public A(A other)
    {
         this.a = other;  // deep copy
    }
}

这是通过复制构造函数进行深层复制的正确方法吗?

2 个答案:

答案 0 :(得分:4)

这不是一本很深的副本。您只是将引用存储到另一个对象。

试试这个:

public A(A other) {
    if(other.a != null) {
        this.a = new A(other.a);
    }
    if(other.hArray != null) {
        this.hArray = new E[other.hArray.length];
        for(int index = 0; index < other.hArray.length; index++) {
            this.hArray[index] = other.hArray[index].clone();
        }
    }
}

这假设E还有一个执行深层复制的复制构造函数。另外我只是注意到E是通用的,所以我的代码可能无法正常工作(但想法就在那里)。

答案 1 :(得分:1)

如果您想要深层复制,则不能只分配 - 这不是深层复制的含义。你需要去:

public A(A other)
{
    if(other != null) {
        this.a = new A(other.a);  // deep copy
    } else {
        this.a = null;
    }
}

这是递归复制,但你可以结束所有类型的无限循环。另外,你需要以某种方式深度复制E,这些泛型有点令人难以置信,所以我不会试图推测你如何做到这一点。