Получить значения из Enum, известного только во время выполнения - PullRequest
4 голосов
/ 24 января 2011

Мне нужно получить все значения из перечисления, тип которого будет известен только во время выполнения. Я придумал следующее, но хотел бы знать, если кто-нибудь знает лучший способ:

enum TestEnum  {
  FOO,
  BAR
}

Enum[] getValuesForEnum(Class type) {
  try {
    Method m = type.getMethod("values");
    return (Enum[])m.invoke(null);
  } catch (Exception e) {
    throw new RuntimeException(e);
  }
}

Class testEnum = Class.forName("TestEnum");
getValuesForEnum(testEnum);

Спасибо! * * 1004

Ответы [ 4 ]

16 голосов
/ 24 января 2011

Вместо этого используйте доступный API:

T[] getValuesForEnum(Class<T> type) {
  return type.getEnumConstants();
}

С Javadoc :

Возвращает элементы этого перечислимого класса или ноль, если этот объект классане представляет тип enum.

Обратите внимание, что я превратил ваш метод в универсальный, чтобы сделать его безопасным для типов.Таким образом, вам не нужно использовать downcast для получения фактических значений перечисления из возвращенного массива.(Конечно, это делает метод настолько тривиальным, что вы можете опустить его и вызвать type.getEnumConstants() напрямую: -)

8 голосов
/ 24 января 2011

Вот вариант ответа Кевина Стембриджа , который сохраняет тип (избегая понижений), в то же время сохраняя защиту от вызова с типом, не относящимся к enum:

static <E extends Enum<E>> E[] getValuesForEnum(Class<E> clazz) {
    return clazz.getEnumConstants();
}
5 голосов
/ 24 января 2011

Я использую type.getEnumConstants ().

3 голосов
/ 24 января 2011

Я думаю, что это работает:

Enum<?>[] getValuesForEnum(Class<Enum<?>> enumType) {
    return enumType.getEnumConstants();
}
...