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

-4

Прежде чем вводить вопрос, я знаю, кроме примитивного типа, все хранится по его ссылочному номеру. Моя структура кода 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 может помочь для глубокой копии, или я мог бы неправильно понимать другие сообщения).

спросил(а) 2014-09-14T12:20:00+04:00 5 лет, 6 месяцев назад
0
72

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

copiedRef = new ArrayList<>(references);

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

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

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

ответил(а) 2014-09-14T12:27:00+04:00 5 лет, 6 месяцев назад
36

Нет.

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

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

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

ответил(а) 2014-09-14T12:26:00+04:00 5 лет, 6 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема