ИМХО, самый простой способ сделать глубокое копирование - это добавить конструктор копирования ко всем вашим классам:
Models
имеет только неизменяемые атрибуты, поэтому его довольно легко создать:
public Models(Models other) {
this(other.model, other.price);
}
К сожалению Cars
также имеет изменяемый атрибут (массивы Models
), поэтому нам нужно что-то другое для копирования этого атрибута:
public Cars(Cars other) {
this.type = other.type;
this.number = other.number;
this.cars = Arrays.stream(other.cars)
.map(Models::new)
.toArray(Models[]::new);
}
Не только мы создаем новый массив, но каждый индивидуальный Models
также свободен sh новый. Обратите внимание, что этот конструктор основан на конструкторе копирования Models
.
Поэтому вместо вызова Cars cloned = (Cars) myCar.clone();
вы просто сделаете: Cars cloned = new Cars(myCar);