К сожалению, есть несколько проблем со статикой и наследованием.
Лучше всего сделать пользовательскую конфигурацию на основе классов декларативную в данных (свойства, XML), но это можно сделать в коде,Базовый класс может содержать карту конфигурации всех детей.
class Base {
private static Map<Class<T extends Base>, Config> configByClass = new HashMap<>();
protected Base(Supplier<Config> configProducer) {
// Could do in constructor:
configByClass.merge(getClass(), (oldk, k) -> {
if (oldk == null) {
return configProducer.get();
}
});
}
protected final Config getConfig() {
// Could do lazy in getter
configByClass.merge(getClass(), (oldk, k) -> {
if (oldk == null) {
return configProducer.get();
}
});
return configByClass.get(getClass());
}
}
class Child1 extends Base {
public Child1() {
super(() -> {
Config config = new Config(1, 3, 4);
...
return config;
});
}
void f() {
}
}
Вызов поставщика конфигурации внутри Конструктор имеет одну маленькую ловушку: поля дочернего класса по-прежнему недоступны, но вы сделалине хочу использовать отдельные объекты в любом случае.