【问题标题】:how is java deep copy possible in this situation在这种情况下如何实现 Java 深拷贝
【发布时间】:2013-11-21 09:18:56
【问题描述】:

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

问题:

class Animal{

AnimalGroup animalGroup;

}

class AnimalGroup{

List<Animal> animalList;

}

class MainProgram{

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

}

注意:很明显,一只动物只能属于一个动物组。

我想深度复制地图rankedAnimalGroups。

案例 1:克隆

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

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 调用 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;
}

Animal 中的构造函数

public Animal(Animal other, AnimalGroup animalGroup)
{
  this.animalGroup = animalGroup;
  ...
}

问题 在这种情况下,有没有更好的深拷贝解决方案。

编辑1

对于序列化相关方法而言,数据量太大。

编辑2

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

【问题讨论】:

标签: java performance


【解决方案1】:

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

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

【讨论】:

  • 这是一个很好的答案。对于 Animal 和 AnimalGroup 具有一对一关系而不是 List 的情况,您的答案将是完美的。无论如何,谢谢,我会试试这个。只是好奇,你是刚才想出答案还是在这种情况下这是正常的做法?
  • 即使在一对多的情况下也应该工作。你只需要Animal 类中的deepCopyExceptGroup。我只是在飞行中想出了它,但是这种算法一直伴随着循环数据出现。它让我想起了我在本科学校的编程语言课程中学到的东西。我看看能不能找到参考资料。
  • 提供参考会很好,谢谢。之间,我知道您的解决方案也适用于一对多,实际上我将使用类似的变体,我只是指出一对一的情况。
【解决方案2】:

你可以serialize-deserialize对象,这是深度克隆的健壮方式

【讨论】:

  • 当然有使用 3rd 方编组器/解组器的有效方法
猜你喜欢
  • 2016-12-03
  • 1970-01-01
  • 1970-01-01
  • 2015-08-23
  • 2012-02-19
  • 1970-01-01
  • 2012-04-28
  • 2015-06-12
  • 2013-03-14
相关资源
最近更新 更多