ArrayList (полностью глубокая копия)

Прежде чем ввести вопрос, я знаю, кроме примитивного типа, все хранится по его ссылочному номеру. Моя структура кода Java выглядит примерно так... Сначала у меня есть классы водителя, бронирования и автомобиля. Отношения между ними - водитель - это водитель, который выполнил резервирование, и автомобиль забронирован для вождения, который хранится в классе бронирования.

Водитель позаботится о бронировании. Автомобили имеют несколько примитивных типов информации. Несколько автомобилей могут быть сохранены в резервации (примитив и ArrayList). Но один водитель (ArrayList) (из класса водителя) может иметь несколько бронирований. Поэтому, когда я разрешаю пользователям просматривать то, что есть у водителя в его бронировании, я хотел бы глубоко скопировать все в ArrayList поскольку все, кроме примитивных типов, являются ссылочными номерами.

В любом случае, я сделаю копию списка массивов для резервирования в классе драйверов.

В моем классе драйверов, и это аксессор, и когда он передает ArrayListЯ попытался сначала скопировать и передать ArrayList,

public ArrayList<Reference> getReference() {    

    copiedRef = new ArrayList<Reference>();

    //references have been declared above
    for (int i = 0; i < references.size(); i++) {
        copiedRef.add(references.get(i));
        //getting each element in the arrayList one by one and push to a new ArrayList
    }

    return copiedRef;
}

Это делает глубокую копию? И если мне нужно использовать clone(),

Как бы я улучшить? (clone делает мелкую копию, я не думаю, clone может помочь для глубокого копирования или я мог неправильно понять другие сообщения).

2 ответа

Ваш код вообще не копируется, кроме списка ссылок. Это эквивалентно одной строке

copiedRef = new ArrayList<>(references);

clone может сделать глубокое копирование, и оно разработано специально для поддержки этого. Только реализация по умолчанию в Object делает мелкое копирование.

Тем не менее, обычно не рекомендуется беспокоиться о clone из-за его загадочных договорных требований и ограничений в отношении final поля. Вместо этого вы можете предоставить конструктор копирования вашего класса домена.

Обычно самый простой способ с использованием наименьшего количества кода для глубокого копирования - это цикл сериализации-десериализации в памяти. Только заметьте, что в данном случае "производительность" - это грязное слово:)

Нет.

copiedRef.add(references.get(i));

Приведенный выше код получает каждый объект типа Reference и сохраняет эти ссылки в этом новом массиве (скопированный Ref). По сути, вам нужно создать новый экземпляр с тем же состоянием, что и у каждого объекта reference.get (i).

Если ваш ссылочный тип имеет все примитивные типы, вы можете вызвать (Reference)references.get(i).clone() при добавлении этих ссылок.

Другие вопросы по тегам