2011-07-10 4 views
0

私はオブジェクトを必要な型にキャストするコードを書いています。また、必要な型がカスタムクラスオブジェクトで、別のオブジェクトがある場合は、再帰的にキャストする必要があります。ところで、入力がハッシュマップの場合は、オブジェクトを作成する必要があることがわかります。別のhashMapがある場合は、そのオブジェクトがオブジェクト内にあることを理解する必要があります。内側のオブジェクトから内部のhashMapを構築する必要があります。それを構築するには、メソッドを再帰的に呼び出します。コード私はここに描いている。しかし、これらの2つのクラスのCastorとMyBuilderはどちらもサイクルに入っています。私はそれを壊す方法を取得していません。メソッドが循環していない場合、依存関係を壊すことができます。しかし、サイクルで誰も助けることができますか? どのようなパターンを紹介することができますか、またはこれをどのようにリファクタリングすることができますか?メソッドが再帰的であるときに循環依存を避けるためにどのようにリファクタリングするのですか?

ありがとうございます。 .....

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);   
    } 

}}

答えて

0

これのreturnValue castPrimitive(....ボイドsetParameterToEntity: PL参照サイクルへの高速アクセスの場合:

コードは次のようなものですセクションは私にとっては疑わしいと思われる - あなたはそれぞれのメソッドと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. 値に渡しています。

私はあなたのハッシュマップは、セッターの名前と関連付けられた値のリストであるので、あなたは、ハッシュマップのキーを反復処理し、それぞれの方法を識別するためにすべきではないと仮定し、その後の値でメソッドを呼び出しますパラメータとしてのハッシュマップ複数のパラメータをサポートするには、別のハッシュマップが必要です。

このコードはハッシュマップのオブジェクトグラフを繰り返し処理し、別のオブジェクトグラフを生成するため、ハッシュマップがハッシュマップ内の他の要素への参照を格納するのに十分なほど巧妙であるか、 a)オブジェクトからの要素の代わりに同じオブジェクトを渡す(回転させる)、またはb)ハッシュマップグラフではなく、構築されているオブジェクトを反復処理するバグがある。

上記のコードスニペットが与えられていると私は問題だと思います。:)上記のようにdeclaredMethodsではなくハッシュマップを繰り返し処理し、メソッド(hashmapキーから決定)と値を渡すようにしますハッシュマップはsetParameterToEntityにあり、ハッシュマップ自体ではありません。

0

ありがとう@memetech:今私はそれをキャスターにロジックを置いています。そして、要求を処理するキャスター用のさまざまなサブクラスを作成します。

+0

memetechの回答が正しい場合は、自分の代わりに正しいとマークする必要があります。 – SJuan76

+0

私は彼の答えが正しいとは言わなかった。私は助けてくれてありがとう。あなたは私がそれを行うと主張する場合::) –

関連する問題