Как сделать рефакторинг, чтобы избежать циклических зависимостей, когда методы рекурсивны? - PullRequest
0 голосов
/ 10 июля 2011

Я написал код для приведения объекта к требуемому типу. И если требуемый тип является объектом пользовательского класса, и у него есть другой объект, мы должны привести его рекурсивно. Кстати, я буду знать, что мне нужно создать объект, если входные данные являются hashMap. Если в стороне HashMap, если есть другой hashMap, тогда мне нужно понять, что это объект внутри объекта. А внутри объекта мне нужно построить из внутреннего hashMap. Для его построения я буду вызывать метод рекурсивно. Код, который я изобразил здесь. Но эти 2 класса 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 голосов
/ 13 июля 2011

спасибо @memetech: теперь я добавляю логику конструктора в сам ролик и создаю различные подклассы для кастера, которые будут обрабатывать запрос.

0 голосов
/ 10 июля 2011

Этот раздел кажется мне подозрительным - вы перебираете каждый метод и для каждого вызываете 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. Вы передаете один и тот же объект каждому методу создаваемого вами класса.

Я предполагаю, что ваш hashmap представляет собой список имен сеттеров и связанного с ним значения, поэтому не следует перебирать ключи hashmap и для каждого идентифицировать метод, а затем вызывать метод со значением из hashmap в качестве параметра.Для поддержки нескольких параметров вам понадобится другая хеш-карта.

Поскольку этот код перебирает граф объектов в хеш-картах и ​​создает другой граф объектов, циклы должны появляться только в том случае, если хеш-карты достаточно умны для хранения ссылок на другие элементы вhashmap, или у вас есть ошибка в коде, такая как а) передача одного и того же объекта вместо элементов объекта (вызывая его вращение), или б) у вас есть ошибка, когда вы перебираете объект, который создается, а неграфик hashmap.

Учитывая приведенный выше фрагмент кода, я думаю, что проблема заключается в обоих :), поэтому итерируйте по hashmap, а не объявленномуMethods, как я говорил выше, и убедитесь, что вы передаете метод (определенный из ключа hashmap) и значение из хеш-карты в setParameterToEntity, а не сам хеш-файл.

...