Как получить все значения перечисления в Java?

95

Я столкнулся с этой проблемой, потому что, не зная фактического enumтипа, мне нужно перебрать его возможные значения.

if (value instanceof Enum){
   Enum enumValue = (Enum)value;
}

Есть идеи, как извлечь из enumValue его возможные значения?

Римский
источник

Ответы:

154
Object[] possibleValues = enumValue.getDeclaringClass().getEnumConstants();
ColinD
источник
Почему вы используете getDeclaringClass ()?
Питер Кринс
3
@PeterKriens: Потому getClass()что enumобъект может возвращать подтип самого enumтипа (если, скажем, enumконстанта переопределяет метод из enumтипа). getDeclaringClass()возвращает enumтип, который объявил эту константу, что вам и нужно здесь.
ColinD
Спасибо! Я не осознавал этот случай, но вы правы, константа может быть анонимного внутреннего класса.
Peter Kriens
97
YourEnumClass[] yourEnums = YourEnumClass.class.getEnumConstants();

Или

YourEnumClass[] yourEnums = YourEnumClass.values();
кто то
источник
YourEnumClass[] yourEnums = YourEnumClass.class.getEnumConstants();решил мою проблему вызова из нестатического метода.
Джереми
15

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

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

Сделать это можно так:

enumValue.getDeclaringClass().getEnumConstants() 

Это вернет массив объектов Enum, каждый из которых является одним из доступных вариантов.

РодеоКлоун
источник
14

values ​​метод перечисления

enum.values ​​(), который возвращает все экземпляры перечисления.

  public class EnumTest {
        private enum Currency {
        PENNY("1 rs"), NICKLE("5 rs"), DIME("10 rs"), QUARTER("25 rs");
        private String value;
        private Currency(String brand) {
              this.value = brand;
        }

        @Override
        public String toString() {
              return value;
        }
  }

  public static void main(String args[]) {

        Currency[] currencies = Currency.values();

        // enum name using name method
        // enum to String using toString() method
        for (Currency currency : currencies) {
              System.out.printf("[ Currency : %s,
                         Value : %s ]%n",currency.name(),currency);
        }
  }
}

http://javaexplorer03.blogspot.in/2015/10/name-and-values-method-of-enum.html

Раджеш Диксит
источник
7

... или MyEnum.values ​​()? Или я что-то упускаю?

удалено
источник
2
Да, фактический класс перечисления недоступен здесь для вызова статического метода, это просто экземпляр некоторого подтипа Enum.
ColinD
3

Здесь Role - это перечисление, которое содержит следующие значения [ADMIN, USER, OTHER].

List<Role> roleList = Arrays.asList(Role.values());
roleList.forEach(role -> {
    System.out.println(role);
    });
Ашвани Шарма
источник
Однако это не является общим. Вопрос в том случае, когда есть только объект Enum. Таким образом, вам нужно либо пройти через объявление класса, либо лучше, через EnumSet.
zeratul021
3

Также можно использовать java.util.EnumSet следующим образом

@Test
void test(){
    Enum aEnum =DayOfWeek.MONDAY;
    printAll(aEnum);
}

void printAll(Enum value){
    Set allValues = EnumSet.allOf(value.getClass());
    System.out.println(allValues);
}
Дэвид Лилльегрен
источник