Как применять определенные методы создания объектов? - PullRequest
1 голос
/ 02 февраля 2012

Я работаю с абстрактным классом и (растущим) набором подклассов этого класса. По определенным причинам все подклассы 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));
}

1 Ответ

1 голос
/ 02 февраля 2012

эти классы могут быть [...] настроены с помощью файла конфигурации

В этом случае общий подход похож на ваше первое предложение: Class.forName("...").newInstance()

(Конечно, это может быть инкапсулировано каким-то заводским шаблоном.)

Поскольку в Java нельзя принудительно реализовать конкретный конструктор подклассами, единственный жизнеспособный способ - требовать конструктора по умолчанию в соответствии с руководящими принципами / контрактами проектирования.

В качестве примера рассмотрим Android 101 * Parcelable :

Классы, реализующие интерфейс Parcelable, также должны иметь статический поле с именем CREATOR, которое является объектом, реализующим Интерфейс Parcelable.Creator.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...