在这种情况下,java深度复制如何可能

时间:2013-11-21 09:18:57

标签: java performance

注意:我查看过不同的地方,包括stackoverflow,但没有找到解决方法。

问题

class Animal{

AnimalGroup animalGroup;

}

class AnimalGroup{

List<Animal> animalList;

}

class MainProgram{

// Map<groupRank, animalGroup>
Map<Integer, AnimalGroup> rankedAnimalGroups;

}

注意:很明显,一个Animal只能属于一个AnimalGroup。

我想深度复制地图 rankingAnimalGroups

案例1:克隆

我将使我的Animal and AnimalGroup克隆。

AnimalGroup中的克隆方法

protected Object clone() throws CloneNotSupportedException {
    AnimalGroup clonedAnimalGroup = (AnimalGroup)super.clone();
    for(Animal animal: animalList)
       clonedAnimalGroup.addAnimal(animal.clone);

    return clonedAnimalGroup;
}

动物中的克隆方法

protected Object clone() throws CloneNotSupportedException {
    Animal clonedAnimal = (Animal)super.clone();
    clonedAnimal.animalGroup = animalGroup.clone(); 
}

这将最终进入AnimalGroup调用Animal并反转的循环。

案例2:copyConstructor

HashMap不支持深层复制构造函数

建议的解决方案

我可以使用Animal的构造函数,在AnimalGroup的clone方法中,如下所示

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;
  ...
}

问题 在这种情况下,是否有更好的深度复制解决方案。

EDIT1

数据大小对于序列化相关方法来说太大了。

EDIT2

我无法在我的项目中包含外部库等复制

2 个答案:

答案 0 :(得分:2)

您可以为自己提供执行深层复制所需的辅助方法。深度复制Animal时,请获取其组的深层副本,并返回与正在复制的Animal对应的该组成员;深度复制组时,获取成员的新副本而不为其分配任何组,将这些新副本添加到新列表,将该列表指定为每个元素的组,然后返回新列表。这样做将要求该组可以访问不立即分配组的特殊构造函数。

此主题还有其他类似的变体。

答案 1 :(得分:1)

您可以serialize-deserialize 深度克隆的强大方式