我正在为每个实体编写自定义克隆方法.对于深层复制,有一种方法可以检测循环引用,或者我必须手动找出它并将克隆限制为单向而不是双向.
例如我们使用hibernate,因此User对象具有对Address和Address的引用,具有对User的引用.试图查看是否可以执行Address和User的深层复制,而不会遇到循环引用问题
要实现这一点,您需要一个已克隆对象的引用Map.我们实现了这样的深度克隆:
在我们的实体基类中:
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.
...
}
Run Code Online (Sandbox Code Playgroud)