Bagaimana cara mendapatkan semua nilai enum di Java?


95

Saya menemukan masalah ini sehingga saya tanpa mengetahui enumtipe sebenarnya yang saya butuhkan untuk mengulangi kemungkinan nilainya.

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

Ada ide bagaimana mengekstrak dari enumValue kemungkinan nilainya?

Jawaban:


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

Mengapa Anda menggunakan getDeclaringClass ()?
Peter Kriens

3
@PeterKriens: Karena getClass()suatu enumobjek dapat mengembalikan subtipe dari enumtipe itu sendiri (jika, katakanlah, enumkonstanta menimpa metode dari enumtipe). getDeclaringClass()mengembalikan enumtipe yang menyatakan konstanta itu, yang Anda inginkan di sini.
ColinD

Terima kasih! Saya tidak menyadari kasus itu tetapi Anda benar, konstanta dapat menjadi kelas dalam anonim.
Peter Kriens

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

Atau

YourEnumClass[] yourEnums = YourEnumClass.values();

YourEnumClass[] yourEnums = YourEnumClass.class.getEnumConstants();memecahkan masalah saya menelepon dari metode non-statis.
Jeremy

15

Enums sama seperti Classes yang diketik. Kode Anda saat ini hanya memeriksa apakah itu adalah Enum tanpa menentukan jenis Enum itu.

Karena Anda belum menentukan jenis enum, Anda harus menggunakan refleksi untuk mencari tahu apa daftar nilai enum itu.

Anda bisa melakukannya seperti ini:

enumValue.getDeclaringClass().getEnumConstants() 

Ini akan mengembalikan larik objek Enum, dengan masing-masing menjadi salah satu opsi yang tersedia.


14

nilai metode enum

enum.values ​​() yang mengembalikan semua instance enum.

  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

... atau MyEnum.values ​​()? Atau apakah saya melewatkan sesuatu?


2
Ya, kelas sebenarnya dari enum tidak tersedia di sini untuk melakukan pemanggilan metode statis, hanya sebuah instance dari beberapa subtipe Enum.
ColinD

3

Di sini, Peran adalah enum yang berisi nilai berikut [ADMIN, USER, OTHER].

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

Namun, ini tidak umum. Pertanyaannya adalah tentang kasus ketika hanya memiliki objek Enum. Jadi Anda harus pergi melalui mendeklarasikan kelas atau lebih baik, melalui EnumSet.
zeratul021

3

Anda juga bisa menggunakan java.util.EnumSet seperti ini

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

void printAll(Enum value){
    Set allValues = EnumSet.allOf(value.getClass());
    System.out.println(allValues);
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.