我想避免 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/