I would use a map to map a runtime type to an enum constant, for example:
public enum ClassType{
A(Integer.class),
B(String.class),
C(Object.class),
UNKNOWN(null);
private static final Map<Class<?>, ClassType> typesMap = new HashMap<>();
public final Class<?> type;
static{
for (ClassType classType : EnumSet.allOf(ClassType.class)){
if(classType.type != null){
typesMap.put(classType.type, classType);
}
}
}
private ClassType(Class<?> type){
this.type = type;
}
public static ClassType getClassTypeOf(Class<?> type){
return typesMap.getOrDefault(type, UNKNOWN);
}
}
It could be used like this:
switch(ClassType.getClassTypeOf(var.getClass())){
case A:
break;
case B:
break;
case C:
break;
default:
break;
}
However, this version does not consider supertypes of the type of var
. To support supertype lookups you can change the getClassTypeOf-method to:
public static ClassType getClassTypeOf(Class<?> type){
for(Class<?> lookupType = type; lookupType != null; lookupType = lookupType.getSuperclass()){
ClassType classType = typesMap.get(lookupType);
if(classType != null){
return classType;
}
}
return UNKNOWN;
}