java - 在 java 中,如何使用 isAssignableFrom 的映射避免多个 if else

标签 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;
    }
 }

有人可以建议如何做到这一点吗?谢谢

最佳答案

您可以将类及其参数存储在 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
          }
     }
}

具体实现取决于你的类。如果映射中的类彼此之间没有关系(例如父类(super class)、子类、接口(interface)等),那么您可以直接应用代码。否则,正如 bestsss 所指出的,您应该坚持父类(super class)/接口(interface)迭代以保留类层次结构

您可以进一步调查 Java Annotations ,虽然我不是 100% 确定如何在您的情况下应用它们,但没有关于要求的更多详细信息。你可以用参数注释你的父类(super class)

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

并在使用 cls.getSuperClass() 迭代期间获取方法参数类型的父类(super class)并在之后检索带注释的参数值以进行分配。

关于java - 在 java 中,如何使用 isAssignableFrom 的映射避免多个 if else,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11384341/

相关文章:

java - 声明要在数组中使用的枚举?

java - 如何更改为使用 MXBean 定义的操作显示的输入描述

java 将 null 放入 int 变量中

java - Spring ModelAndView.setViewName ("view")在错误位置搜索

java - 使用 StreamGobbler 处理输入

java - Maven 依赖项 jar 中的 Taglib。我如何在 web.xml 中配置这个 taglib?

java - IInAppBillingService.aidl 无法在 Android Studio 中生成 Java 文件

java - 实例化 RobotFixture 的新实例以传递给构造函数

java - 这还是多态吗?

java - J面板: layout help needed