Як отримати всі значення переліку в 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

Дякую! Я не усвідомлював цього випадку, але ти маєш рацію, константа може бути анонімного внутрішнього класу.
Пітер Крінс

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

значення методу переліку

метод 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.