Я работаю с абстрактным классом и (растущим) набором подклассов этого класса. По определенным причинам все подклассы A должны реализовывать шаблон синглтона. Во время запуска приложения существует List<Class<? extends A>>
, и я хотел бы инициализировать все экземпляры синглтона.
Из того, что я вижу, я могу выбрать Reflection, следуя указаниям, что все классы, реализующие A, должны иметь определенный конструктор и вызывать его через o.getDeclaredConstructor().newInstance();
.
Я также попробовал другой подход, в котором я использовал перегрузку статических методов. То есть A определил статический метод initialize
, и все подклассы должны были переопределить этот метод. Вызов может быть снова вызван через отражение.
Первый подход имеет очевидный недостаток, заключающийся в том, что нарушения руководства по программированию приводят только к ошибкам во время выполнения, а не к ошибкам во время компиляции. Второе еще хуже, если подкласс не реализует статический метод, вызывается только метод в A
без явного исключения.
Итак: Как применить единый способ инициализации в наборе одноэлементных классов?
Редактировать:
Класс конфигурации генерирует список всех дочерних элементов A
во время запуска, эти классы могут быть либо зарегистрированы непосредственно в классе конфигурации программно, либо настроены через файл конфигурации:
private void initModules() {
Configurator.addModule("modulename", SubOfA.class);
...
}
private void initModuleFile() {
...
String name = in.readLine();
String classname = ...;
String modulename = ...;
Configurator.addModule(modulename, Class.forName(classname));
}