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

您可以将类及其参数存储在 a 中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()然后检索带注释的参数值进行赋值。

于 2012-07-08T15:50:49.553 回答