我正在为每个实体编写自定义克隆方法。对于深度复制,有一种方法可以检测循环引用,或者我必须手动找出它并将克隆限制为单向而不是双向。
例如,我们使用 hibernate 模式,因此User对象具有对Address的引用,而Address具有对User的引用。尝试查看是否可以对地址和用户进行深层复制,而不会遇到循环引用问题
最佳答案
要实现此目的,您需要一个对已克隆对象的引用映射。我们实现了深度克隆,如下所示:
在我们的实体基类中:
public void deepClone() {
Map<EntityBase,EntityBase> alreadyCloned =
new IdentityHashMap<EntityBase,EntityBase>();
return deepClone(this,alreadyCloned);
}
private static EntityBase deepClone(EntityBase entity,
Map<EntityBase,EntityBase> alreadyCloned) {
EntityBase clone = alreadyCloned.get(entity);
if( clone != null ) {
return alreadyClonedEntity;
}
clone = newInstance(entity.getClass);
alreadyCloned.put(this,clone);
// fill clone's attributes from original entity. Call
// deepClone(entity,alreadyCloned)
// recursively for each entity valued object.
...
}