有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我希望避免在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) 个答案

  1. # 1 楼答案

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

    并在使用^{}的迭代过程中获取方法参数类型的超类,然后检索带注释的参数值以进行赋值