当方法递归时,如何重构以避免循环依赖?

时间:2011-07-10 13:30:18

标签: java design-patterns refactoring cyclic-reference

我编写了将对象强制转换为所需类型的代码。如果所需类型是自定义类对象并且它有另一个对象,我们需要递归地转换它。顺便说一句:我知道如果输入是一个hashMap,我需要构造一个对象。如果在HashMap的旁边,如果有另一个hashMap,那么我需要了解它在对象中的对象。在内部对象中,我需要从内部hashMap构建。为了构建它,我将以递归方式调用该方法。我在这里描述的代码。但是这两个类Castor和MyBuilder都已成为循环。我没有得到如何打破它。如果该方法不是循环的,我们可以破坏依赖性。但循环可以任何一个帮助? 我可以介绍任何模式或如何重构这个模式?

提前致谢。

代码是这样的: 为了更快地访问循环pl,请参考:returnValue castPrimitive(....和void setParameterToEntity .....

MyBuilder myBuilder = new MyBuilder();

class Castor {
public Object castToRequiredType( Type type, Object object) {
    String typeString = type.toString();
    Object returnValue = null;
    if (myUtils.isTypePrimitive(typeString)) {
        returnValue = castPrimitive(object.toString(), typeString);
    }else if {
 // some conditions and some casting logic.
}
else {
        returnValue = myBuilder.buildCustomObject(this,typeString, object);
    }
    return returnValue;
   }
  // other methods which call castToRequiredType() recursively.
}


 class MyBuilder{
 buildCustomObject(Castor castor,
          String classOfType, Object object){
     Class<?> loadedClass = myUtils.loadClass(classOfType);

        instance = loadedClass.newInstance();
        HashMap<?, ?> myMap;
        List<Method> declaredMethods = myUtils.getMethodsForClass(loadedClass);
        for (Method method : declaredMethods) {
            if (object instanceof HashMap<?, ?>) {
                myMap = (HashMap<?, ?>) object;
        // ITERATE THROUGH MAP AND CALL THE SET PARAMETER TO ENTITY METHOD.
                    }
                }
            }
     return instance;
}

 void setParameterToEntity(Castor caster,
Object instance,  Method method,  Object value) {
    ype[] parameterTypes = method.getGenericParameterTypes();
    Object castedValue = caster.castToRequiredType(
    parameterTypes[0], value);          
   }

} }

2 个答案:

答案 0 :(得分:0)

这部分似乎对我很怀疑 - 你正在迭代每个方法,并且每个方法都在调用setParameterToEntity

for (Method method : declaredMethods) {
        if (object instanceof HashMap<?, ?>) {
            myMap = (HashMap<?, ?>) object;
    // ITERATE THROUGH MAP AND CALL THE SET PARAMETER TO ENTITY METHOD.
  1. 您忽略了哈希映射中的键,只是传递了值(请参阅setParameterToEntity sig)

  2. 您将同一个对象传递给您正在构建的类中的每个方法。

  3. 我假设你的hashmap是一个setter名称和相关值的列表,所以不应该迭代hashmap键,并且每个键都标识Method,然后使用hashmap中的值调用Method作为参数。要支持多个参数,您需要另一个hashmap。

    由于此代码在散列图中迭代对象图并生成另一个对象图,因此仅当散列图足够聪明以存储对散列图中其他元素的引用,或者您在代码中有错误时,才会出现循环。 )传递相同的对象而不是来自对象的元素(导致它旋转),或者b)你有一个错误,你正在迭代正在构建的对象而不是hashmap图。

    鉴于上面的代码片段,我认为问题都是:),所以如上所述迭代hashmap而不是declaredMethods,并确保你传递方法(从hashmap键确定),以及来自hashmap到setParameterToEntity,而不是hashmap本身。

答案 1 :(得分:0)

谢谢@memetech:现在我将构建器逻辑放在自带的脚轮中,并为脚轮创建各种子类来处理请求。