繁体   English   中英

如何在Java中深度克隆包含多个对象的对象列表?

[英]How to deep clone an object list that contains several objects in java?

假设有一个EmployeeList包含5个Employee对象。

我想对该EmployeeList进行克隆以创建一个新的EmployeeList,我想知道该怎么做?

因此,以下是我的班级Employee:

public class Employee {
private String name;
private String ssn;
private double salary;

private String name() {
    return name;
}

private void name(String name) {
    this.name = name;
}

private String ssn() {
    return ssn;
}

private void ssn(String ssn) {
    this.ssn = ssn;
}

private double salary() {
    return salary;
}

private void salary(double salary) {
    this.salary = salary;
}

void initialize(String initName, String initSsn, double initSalary) {
    this.name(initName);
    this.ssn(initSsn);
    this.salary(initSalary);
}

public Employee(String name, String ssn, double salary) {
    this.initialize(name, ssn, salary);
}

public Employee clone() {
    return new Employee(this.name, this.ssn, this.salary);
}
}

以下是我的班级EmployeeList:

public class EmployeeList implements Cloneable {
private Employee[] list;
private int MAX = 5;

public EmployeeList() {
    list = new Employee[MAX];
    for (int i = 0; i < MAX; i++)
        list[i] = null;
}

public void add(Employee employee) {
    list[count] = employee;
}

public Object clone() {
    try {
        return super.clone();
    } catch (CloneNotSupportedException c) {
        System.out.println(c);
        return null;
    }
}   
}

我缩短了代码,以便于查看。

我的问题是:

执行复制时,我认为它复制了EmployeeList并带有指向原始Employee对象的指针。 因为当我更改原始对象时,新列表中的对象也会更改

反正我能解决这个问题吗?

非常感谢你。

是的,它确实按照您的想法进行了操作-它克隆了包括其值的数组。 在这种情况下,数组值是指向Employee实例的指针,因此您获得了指向相同Employees的第二个数组。 它称为浅拷贝。 如果您想要完整副本,则需要类似

public Object clone() {
    try {
        EmployeeList copy = (EmployeeList) super.clone();
        if (list!=null) {
            copy.list = new Employee[list.length];
            for (int i=0; i<list.length; i++) {
                copy.list[i] = (Employee)list[i].clone();
            }
        } else {
            copy.list = null;
        }
        return copy;
    } catch (CloneNotSupportedException c) {
        System.out.println(c);
        return null;
    }
}

您还需要使员工成为好人。 通常,当您处理对象图时,每个对象的clone()方法都需要递归地克隆其数据成员,直到您击中基元(如double )或不可变的类(一旦构造便无法更改的类,例如您的String )。

EmployeeList.cone() ,调用了super.clone()进行浅表复制,您应该遍历列表元素并在每个Employee对象上调用clone() ,如下面的伪代码:

EmployeeList.clone() {
   EmployeeList newList = (EmployeeList) super.clone();
   int i=0;
   for (Employee emp: this.list){
      newList[i++] = (Employee) emp.clone();
   }
   return newList;
}

不使用Cloneable另一种选择是使用Serializable接口,并使用Apache commons SerializationUtils之类的实用程序来深度克隆对象http://commons.apache.org/lang/api-2.3/org/apache/commons/lang/SerializationUtils。 html#clone%28java.io.Serializable%29

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM