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


95

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

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

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

Ответы:


154
Object[] possibleValues = enumValue.getDeclaringClass().getEnumConstants();

Почему вы используете 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);
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.