Java – inheritance aware class for mapping to replace the ‘instanceof’ series
I'm looking for some magical class map utilities that give a type and return the value associated with that type or its closest supertype This is a replacement statement or something
if (... instanceof A) return valueA; else if (... instanceof B) return valueB; ...
I have read the answer of avoiding instance of in Java, which puts forward many patterns, especially visitor pattern However, since the goal is to return a simple value, implementing visitors seems to be overkill
Unfortunately, the new JDK class classvalue is also ineligible because it does not check for supertypes
I want to check whether this utility exists in any well-known library before I launch it myself The implementation should be thread safe and want to have a lower number of values inserted than the linear cost w.r.t
Solution
Maps can be made If you want class inheritance, you need to go up
private final Map<Class<?>,Object> map = HashMap<>();
public void register(Class<?> clazz,Object value) {
map.put(clazz,value);
}
public Object getValue(Class<?> clazz) {
if (clazz == null) {
return null;
}
Object value = map.get(clazz);
if (value == null) {
clazz = clazz.getSuperclass(); // May be null.
return getValue(clazz);
}
}
This is useful for int.class, etc
If there is a relationship between value and class:
public <T> T getValue(Class<T> clazz) {
Object value = map.get(clazz);
return clazz.cast(value);
}
