#java #java-sealed-type
Вопрос:
Есть ли способ получить коллекцию экземпляров подклассов, которые разрешены в sealed
классе?
Было бы неплохо иметь что-то похожее на Enum.values()
метод, потому что я не хочу собирать их вручную.
Лучшее, что я мог сделать, это:
abstract sealed class Color permits Green, Red /*, ...*/ {
Iterable<Color> values() {
return Arrays.stream((Class<Color>[]) Color.class.getPermittedSubclasses())
.flatMap(subclass -> {
try {
return Stream.of(subclass.getDeclaredConstructor().newInstance());
} catch (ReflectiveOperationException ignore) {
return Stream.empty();
}
}).toList();
}
}
Комментарии:
1. Каким образом вы хотите «лучшего» решения? По — моему, твой выглядит довольно неплохо.
2. Я думаю, что, кроме обработки аннотаций генерации кода, у вас нет других вариантов
3. @Sweeper Я надеюсь найти более элегантное решение
4. Я полагаю, что вы хотите реализовать фабричный метод. Идея запечатанных классов состояла в том, чтобы ограничить наследование, а не предоставлять фабричный метод, подобный тому, который вы упомянули в перечислениях. Например, Spring и другие фреймворки предоставляют такого рода функциональные возможности с интерфейсами, собирая их реализации, но это не встроенные функции java. Я не думаю, что существует еще одно нехакое решение, основанное на отражении. Если есть еще кто-то, меня это интересует.