我有一个方法,它将类引用作为参数,如下所示:
getConfigModule(Class klass) {
//logic to check the class types
}
我们从其他类调用此方法,如下所示:
getConfigModule(ClassA.class);
getConfigModule(ClassB.class);
getConfigModule(ClassC.class);
我需要在方法中写一些逻辑来检查" klass"是否属于某种类型。例如,检查" klass"属于ClassA和ClassB。
答案 0 :(得分:2)
与@@ RannLifshitz一样,最简单的方法是if-then-else if
或switch
方法。如果你知道只有3个选项,可以打赌什么都不会添加,那就没关系。
对于长期项目,可以使用枚举方式。
public enum PossibleClasses {
CLASS_A(ClassA.class), CLASS_B(ClassB.class);
Class klass;
PossibleClasses(Class klass) {
this.klass = klass;
}
static PossibleClasses fromClass(Class desiredClass) {
for (PossibleClasses current:PossibleClasses.values()) {
if (current.klass == desiredClass) {
return current;
}
}
// here you could implement logic regarding class inheritance or something else.
throw new IllegalArgumentException("Uknown class:"+desiredClass);
}
}
然后与枚举值而不是Class
进行比较。
if (PossibleClasses.fromClass(klass) == CLASS_A) {
//do something
}
当您修改代码时,这将有所帮助。例如,如果某人使用全新的类调用方法,他将获得异常。此外,您可以使用EnumSet
等枚举的一些标准功能来清除代码,例如
// would be a field
private EnumSet<PossibleClasses> commonOption = EnumSet.of(CLASS_A, CLASS_B);
// somewhere inside code
if (commonOption.contains(PossibleClasses.fromClass(klass))) {
// instructions which are common for both classes
}
再次,使用枚举是长期项目的好主意。对于启动或教育/调查项目,您很可能无法从这些额外的代码行中获益。
答案 1 :(得分:0)
使用Foo.class.isAssignableFrom(klass) or klass.isAssignableFrom(Foo.class)
如果相同类型,则表示类Foo
是klass
的超类或超接口,或者相反。
如果你想要严格的平等,只需使用equals
方法。