ПРИМЕЧАНИЕ. Я просмотрел разные места, включая stackoverflow, и не нашел решения этой проблемы.
ПРОБЛЕМА:
class Animal{
AnimalGroup animalGroup;
}
class AnimalGroup{
List<Animal> animalList;
}
class MainProgram{
// Map<groupRank, animalGroup>
Map<Integer, AnimalGroup> rankedAnimalGroups;
}
Примечание. Очевидно, что одно животное может принадлежать только одной группе животных.
Я хочу глубоко скопировать карту rankedAnimalGroups.
Случай 1: клонирование
Я сделаю свое животное и группу животных клонируемыми.
Метод клонирования в AnimalGroup
protected Object clone() throws CloneNotSupportedException {
AnimalGroup clonedAnimalGroup = (AnimalGroup)super.clone();
for(Animal animal: animalList)
clonedAnimalGroup.addAnimal(animal.clone);
return clonedAnimalGroup;
}
Метод клонирования в Animal
protected Object clone() throws CloneNotSupportedException {
Animal clonedAnimal = (Animal)super.clone();
clonedAnimal.animalGroup = animalGroup.clone();
}
Это закончится циклом вызова AnimalGroup и наоборот.
Case2: copyConstructor
HashMap не поддерживает конструктор глубокого копирования
Предлагаемое решение
Я могу использовать конструктор для Animal внутри метода клонирования AnimalGroup следующим образом
Метод клонирования в AnimalGroup
protected Object clone() throws CloneNotSupportedException {
AnimalGroup clonedAnimalGroup = (AnimalGroup)super.clone();
for(Animal animal: animalList)
clonedAnimalGroup.addAnimal(new Animal(animal, this));
return clonedAnimalGroup;
}
Конструктор в Животном
public Animal(Animal other, AnimalGroup animalGroup)
{
this.animalGroup = animalGroup;
...
}
Вопрос Есть ли лучшее решение для глубокого копирования в таком случае.
Изменить1
Размер данных слишком велик для подхода, связанного с сериализацией.
Изменить2
Я не могу включать внешние библиотеки и т. д. для копирования в свой проект.