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

Jas*_*Jas 3 java

我想避免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;
    }
 }
Run Code Online (Sandbox Code Playgroud)

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

Kon*_*che 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
          }
     }
}
Run Code Online (Sandbox Code Playgroud)

具体实现取决于您的类.如果地图中的类彼此之间没有关系(例如超类,子类,接口等),那么您可以直接应用代码.否则,正如bestsss指出的那样,你应该坚持使用超类/接口迭代来保留类层次结构.

此外,您可以调查Java注释,但我不是100%确定如何在您的情况下应用它们,而无需有关要求的更多详细信息.您可以使用参数注释您的超类

@Argument("onearg")
public class SomeClass {
     /* ... */
}
Run Code Online (Sandbox Code Playgroud)

并在迭代期间cls.getSuperClass()获取方法参数类型的超类,然后检索带注释的参数值以进行赋值.

  • @bestsss我想`Collection <Map.Entry>`对于普通的Java编码器来说不太方便,而且你需要你自己实现的`Map.Entry`来实例化它,不是吗?当你需要预先访问键值时,我倾向于使用map迭代而不是重复的`get(obj)`调用.评论有什么问题?我在将`continue`更改为`break`后添加了它,由于`break`,外循环继续使用被检查方法的下一个参数类型. (2认同)