gpt4 book ai didi

java - 在这种情况下,java 深拷贝如何实现

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:50:11 25 4
gpt4 key购买 nike

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

问题:

class Animal{

AnimalGroup animalGroup;

}

class AnimalGroup{

List<Animal> animalList;

}

class MainProgram{

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

}

注意:显然一个 Animal 只能属于一个 AnimalGroup。

我想深度复制 map rankedAnimalGroups

案例一:克隆

我将使我的 Animal 和 AnimalGroup 可克隆。

AnimalGroup中的Clone方法

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 调用 Animal 和 reverse 的循环中结束。

案例2:copyConstructor

HashMap不支持深拷贝构造函数

建议的解决方案

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

AnimalGroup中的Clone方法

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

我不能在我的项目中包含用于复制的外部库等

最佳答案

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

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

关于java - 在这种情况下,java 深拷贝如何实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20116782/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com