Глубокая копия для класса с массивным подклассом в Java - PullRequest
2 голосов
/ 06 февраля 2020

У меня есть этот класс

class Cars implements Transport, Serializable, Cloneable {
   private String type;
   private Models[] cars;
   private int number;
   private static final long serialVersionUID = 1L;

   Cars(String type, int number){
       this.type = type;
       this.number = number;
       cars = new Models[number];
       for (int i = 0; i < number; i++){
           cars[i] = new Models("default"+i, Double.NaN);
       }
   }
    private class Models implements Serializable{
       private String model;
       private double price;

, и мне нужно переопределить clone () для глубокого копирования этого объекта с использованием super.clone (). Как я могу это сделать?

Ответы [ 2 ]

0 голосов
/ 06 февраля 2020

ИМХО, самый простой способ сделать глубокое копирование - это добавить конструктор копирования ко всем вашим классам:

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);

0 голосов
/ 06 февраля 2020

Возможно, вы ищете что-то, указанное в https://www.baeldung.com/java-deep-copy

Метод clone () вернет вам мелкую копию. Вы должны вручную заполнить изменяемые поля в этой мелкой копии новыми объектами. Это сделает вашу копию глубокой копией.

...