правильный способ создания сразу нескольких классов - PullRequest
2 голосов
/ 15 мая 2019

У меня есть класс Main.java, в котором мне нужно создать группу других классов, скажем C1.java ... C50.java. Я не могу придумать элегантный способ создания этих 50 классов в Главном классе. Если я просто соберу весь экземпляр кода в одном месте, он будет выглядеть так людно и безобразно. Сегодня у меня есть 50 классов для создания экземпляров, завтра это число может увеличиться до 100, тогда ситуация ухудшится. Не могли бы вы предложить элегантный способ создания экземпляров всех этих классов, не делая основной класс переполненным кодом реализации. Я не знаю ни одного шаблона проектирования для этого.

Я думаю создать массив классов, для которых необходимо создать экземпляр, и использовать отражение, чтобы создать их экземпляр.

Ответы [ 2 ]

2 голосов
/ 15 мая 2019

Ответ зависит от того, для каких целей будут служить занятия.Однако, если вы не против получить неупорядоченную коллекцию созданных экземпляров классов, есть способ использовать библиотеку Reflections , и я думаю, что в случае строк кода:1003 *

// find out all the classes implementing MyInterface
Set<Class<? extends MyInterface>> subTypes = reflections.getSubTypesOf(MyInterface.class);

// iterate those classes and instntinate them
List<MyInterface> objects = new ArrayList<>();
for (Class<? extends MyInterface> clazz: subtypes) {
    objects.add(clazz.newInstance());
}

В любом случае, весь дизайн должен быть пересмотрен.

0 голосов
/ 22 мая 2019

Рекомендуемое решение - использовать архитектуру загрузчика службы .

Создание всех зарегистрированных реализаций MyInterface может быть сделано так же просто, как

for(MyInterface my: ServiceLoader.load(MyInterface.class)) {
    /* do something with <my> */
}

Чтобы это работало, недостаточно просто реализовать интерфейс, эти реализации должны быть объявлены как поставщики услуг, либо через запись в META-INF/services/ вашего jar-файла (как описано в документации по связанному классу), либо через provides объявление в объявлении модуля Java при использовании Java 9 или новее.

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

См. Также Версия документации класса для Java 9 .

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