Как получить экземпляры всех подклассов запечатанного класса?

#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. Я не думаю, что существует еще одно нехакое решение, основанное на отражении. Если есть еще кто-то, меня это интересует.