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()
при добавлении этих ссылок.