Java在自定义克隆期间检测循环引用

use*_*201 5 java

我正在为每个实体编写自定义克隆方法.对于深层复制,有一种方法可以检测循环引用,或者我必须手动找出它并将克隆限制为单向而不是双向.

例如我们使用hibernate,因此User对象具有对Address和Address的引用,具有对User的引用.试图查看是否可以执行Address和User的深层复制,而不会遇到循环引用问题

Dan*_*iel 7

要实现这一点,您需要一个已克隆对象的引用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)