在java中如何避免多个if else with map for isAssignableFrom

时间:2012-07-08 15:33:09

标签: java

我想在java中避免使用if else:

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

任何人都可以建议如何做到这一点?感谢

1 个答案:

答案 0 :(得分:5)

您可以将类及其参数存储在Map<Class<?>, Object>中并迭代映射,这将通过带有一个if语句的迭代循环替换if-else构造。

例如:

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()获取方法参数类型的超类,然后检索带注释的参数值以进行赋值。