【问题标题】:When I clone a Parent Object, it modifies the child objects of original Parent当我克隆父对象时,它会修改原始父对象的子对象
【发布时间】:2020-03-03 16:44:46
【问题描述】:

我正在尝试克隆一个具有数组的对象,然后该数组中的每个元素也具有不同对象的数组。 对象结构如下:

学校 - SchClass[] - 学生[]

我有一个帮助类,它有下面的代码行来克隆 School 对象。

Helper.java:

schoolClone = (School) originalSchool.clone();

School.java

public object School(){
    School school = null;
    try{
        school = (School) super.clone();
    }
    catch (CloneNotSupportedException e) {
        school = new School();
    }
    school.schClasses = (SchClass[]) this.schClasses.clone();    
    return school;
}

SchClass.java

public object SchClass(){
    SchClass schClass = new SchClass();
    schClass.students = (Student[]) this.students.clone();
    return schClass;
}

Student.java

public object Student(){
    Student student = null;
    try{
        student = (Student) super.clone();
    }catch (CloneNotSupportedException e) {
        student = new Student(this.getName(), this.getAge(), this.getGrade());
    }
    return student;
}

如果我从 schoolClone 对象中删除一个学生,它也会从 originalSchool 对象中删除(这是我的问题)** 但是,如果我从 schoolClone 对象中删除任何 schClass 对象,则 originalSchool 对象将保持原样,并且仅在克隆对象上修改数据。

有没有办法可以从 schoolClone 对象中删除学生,但不会影响我的 originalSchool 对象。

感谢任何帮助。

【问题讨论】:

    标签: java arrays clone


    【解决方案1】:
    1. 克隆数组时,只会克隆数组,不会克隆数组中的元素,
    2. 如果您制作包含“子”对象的对象的副本,并且这些“子”对象具有引用“父”的字段,则必须更新该字段的值,以便它引用父母。

    我个人避免像瘟疫一样避免clone。我宁愿使用复制构造函数。

    【讨论】:

    • 深度克隆解决了我的问题。感谢您提供复制构造函数的想法。我在网上进行了一些研究,似乎许多开发人员更喜欢复制构造函数而不是克隆。下次会尝试这种方法。谢谢。
    【解决方案2】:

    我认为您使用的是浅克隆而不是深度克隆。您必须根据您的要求使用深度克隆并覆盖克隆方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-21
      • 2017-07-20
      • 2015-01-23
      • 1970-01-01
      • 1970-01-01
      • 2011-12-30
      • 1970-01-01
      相关资源
      最近更新 更多