Когда я клонирую родительский объект, он модифицирует дочерние объекты исходного родительского объекта. - PullRequest
0 голосов
/ 07 ноября 2019

Я пытаюсь клонировать Объект, у которого есть Массивы, а затем у каждого элемента в этом Массиве также есть Массивы другого объекта. Структура объекта выглядит следующим образом:

Школа - 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 (этоэто моя проблема) ** однако если я удалил какой-либо объект schClass из объекта schoolClone, объект originalSchool останется как есть, а данные будут изменены только для клонированного объекта.

Есть ли способ удалитьученик из объекта schoolClone, но это не влияет на мой объект originalSchool.

Любая помощь приветствуется.

Ответы [ 2 ]

1 голос
/ 07 ноября 2019
  1. Когда вы клонируете массив, он клонирует только массив, а не элементы в массиве,
  2. Если вы создаете копию объекта, который содержит «дочерние» объекты и эти «дочерние»«У объектов есть поле, которое ссылается на« родителя », значение этого поля должно быть обновлено, чтобы оно ссылалось на клон родителя.

Я лично избегаю clone, как чума. Я скорее использую конструкторы копирования.

0 голосов
/ 07 ноября 2019

Я думаю, что вы используете мелкое клонирование вместо глубокого клонирования. Вы должны использовать глубокое клонирование и переопределить метод клонирования в соответствии с вашими требованиями.

...