Jak uzyskać wszystkie wartości wyliczenia w Javie?


96

Natknąłem się na ten problem, że nie znając rzeczywistego enumtypu, potrzebuję iteracji jego możliwych wartości.

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

Jakieś pomysły, jak wyodrębnić z enumValue jego możliwe wartości?

Odpowiedzi:


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

Dlaczego używasz metody getDeclaringClass ()?
Peter Kriens

3
@PeterKriens: Ze względu getClass()na enumprzedmiot może zwrócić podtyp tego enumsamego typu (w przypadku, powiedzmy, enumstały zastępuje sposób od enumrodzaju). getDeclaringClass()zwraca enumtyp, który zadeklarował tę stałą, co jest tym, czego chcesz tutaj.
ColinD,

Dzięki! Nie zdawałem sobie sprawy z tego przypadku, ale masz rację, stała może należeć do anonimowej klasy wewnętrznej.
Peter Kriens

101
YourEnumClass[] yourEnums = YourEnumClass.class.getEnumConstants();

Lub

YourEnumClass[] yourEnums = YourEnumClass.values();

YourEnumClass[] yourEnums = YourEnumClass.class.getEnumConstants();rozwiązałem mój problem z wywoływaniem z metody niestatycznej.
Jeremy

15

Enums są podobne do Classes, ponieważ są wpisywane. Twój aktualny kod po prostu sprawdza, czy jest to Enum, bez określania, jakiego typu Enum jest częścią.

Ponieważ nie określiłeś typu wyliczenia, będziesz musiał użyć odbicia, aby dowiedzieć się, jaka jest lista wartości wyliczenia.

Możesz to zrobić tak:

enumValue.getDeclaringClass().getEnumConstants() 

To zwróci tablicę obiektów Enum, z których każdy jest jedną z dostępnych opcji.


14

wartości metoda wyliczenia

enum.values ​​(), która zwraca wszystkie wystąpienia wyliczenia.

  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

... lub MyEnum.values ​​()? A może coś mi brakuje?


2
Tak, rzeczywista klasa wyliczenia nie jest tutaj dostępna, aby wywołać metodę statyczną, tylko wystąpienie jakiegoś podtypu Enum.
ColinD

4

W tym przypadku rola to wyliczenie zawierające następujące wartości [ADMIN, USER, OTHER].

List<Role> roleList = Arrays.asList(Role.values());
roleList.forEach(role -> {
    System.out.println(role);
    });

Jednak to nie jest ogólne. Pytanie dotyczy przypadku, gdy mamy tylko obiekt Enum. Musisz więc przejść przez deklarowanie klasy lub lepiej, za pośrednictwem EnumSet.
zeratul021

3

Można również w ten sposób użyć 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);
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.