Java'da tüm enum değerleri nasıl elde edilir?


96

Gerçek enumtürü bilmeden olası değerlerini yinelemem gereken bu problemle karşılaştım .

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

Olası değerlerini enumValue'dan nasıl çıkaracağınıza dair bir fikriniz var mı?

Yanıtlar:


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

Neden getDeclaringClass () kullanıyorsunuz?
Peter Kriens

3
@PeterKriens: Çünkü getClass()bir enumnesnede , türün kendisinin bir altenum türünü döndürebilir (örneğin, enumsabit, enumtürden bir yöntemi geçersiz kılarsa ). bu sabiti bildiren türü getDeclaringClass()döndürür, enumburada istediğiniz şey budur.
ColinD

Teşekkürler! Bu durumu fark etmemiştim ama haklısın, sabit anonim bir iç sınıfa ait olabilir.
Peter Kriens

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

Veya

YourEnumClass[] yourEnums = YourEnumClass.values();

YourEnumClass[] yourEnums = YourEnumClass.class.getEnumConstants();statik olmayan bir yöntemden arama sorunumu çözdüm.
Jeremy

15

Enums, Classyazıldıkları için tıpkı es gibidir . Geçerli kodunuz, parçası olduğu Enum türünü belirtmeden yalnızca Enum olup olmadığını kontrol eder.

Numaralamanın türünü belirtmediğiniz için, enum değerleri listesinin ne olduğunu bulmak için yansıma kullanmanız gerekecektir.

Bunu şu şekilde yapabilirsiniz:

enumValue.getDeclaringClass().getEnumConstants() 

Bu, her biri mevcut seçeneklerden biri olan bir Enum nesnesi dizisi döndürür.


14

enum değer yöntemi

enum.values ​​() yöntemi, tüm enum örneklerini döndürür.

  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

... veya MyEnum.values ​​()? Yoksa bir şey mi kaçırıyorum?


2
Evet, numaralandırmanın gerçek sınıfı burada statik bir yöntem çağrısı yapmak için kullanılamaz, yalnızca Enum'un bazı alt türlerinin bir örneği.
ColinD

4

Burada Rol, aşağıdaki değerleri [ADMIN, USER, OTHER] içeren bir numaralandırmadır.

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

Ancak bu genel değildir. Soru, yalnızca Enum nesnesine sahip olduğumuz durumla ilgilidir. Bu nedenle, EnumSet aracılığıyla ya sınıf bildirme ya da daha iyisi yoluyla gitmeniz gerekir.
zeratul021

3

Bunun gibi java.util.EnumSet de kullanılabilir

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

void printAll(Enum value){
    Set allValues = EnumSet.allOf(value.getClass());
    System.out.println(allValues);
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.