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

例如,我们使用 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.
    ...
}

10-04 09:56