3

if else を回避したいのですが、Java では次のようになります。

 for (Class clazz : method.getParameterTypes()) {
  if (SomeClass.class.isAssignableFrom(clazz)) {
      arguments[i] = onearg;
    } else if (SomeOtherClass.class.isAssignableFrom(clazz)) {
      arguments[i] = someotherarg;
    }
 }

誰でもこれを行う方法を提案できますか? ありがとう

4

1 に答える 1

5

クラスとその引数を に格納しMap<Class<?>, Object>、マップを反復することができます。これにより、if-else コンストラクトが 1 つの if ステートメントによる反復ループに置き換えられます。

たとえば、次のようにします。

Map<Class<?>, Object> map = ... /* initialize */

for (Class cls : method.getParameterTypes()) {  
     for (Entry<Class<?>, Object> candidate : map.entrySet()) {
          if (candidate.getKey().isAssignableFrom(cls)) {
               arguments[i] = candidate.getValue()
               break; // continue with the next parameter type
          }
     }
}

具体的な実装は、クラスによって異なります。マップ内のクラスが相互に関係がない場合(スーパークラス、サブクラス、インターフェースなど)、コードを直接適用できます。それ以外の場合は、bestsssが指摘したように、クラス階層を維持するためにスーパー クラス/インターフェイスの反復に固執する必要があります。

さらにJava Annotationsを調査することもできますが、要件の詳細がないと、あなたの場合にそれらを適用する方法が 100% わかりません。スーパークラスに引数で注釈を付けることができます

@Argument("onearg")
public class SomeClass {
     /* ... */
}

反復中にメソッドパラメータータイプのスーパークラスをcls.getSuperClass()取得し、後で割り当てのために注釈付きの引数値を取得します。

于 2012-07-08T15:50:49.553 に答える