簡體   English   中英

Java:如何從任意枚舉 class 獲取值

[英]Java: How to get values from an arbitrary Enum class

我有一個枚舉,其中包含對枚舉的 class 的引用,如下所示:

enum Animal { 
  DOG(DayOfWeek.class),
  CAT(Month.class);

  public Class<? extends Enum> clazz;

  Animal(Class<? extends Enum> c) {
    this.clazz = c;
  }

  public String getValuesConcat() {
    String allValues = "";

    // The following line doesn't compile
    for (Object enumValue : EnumSet.allOf(clazz)) {
      allValues += " " + enumValue.toString();
    }

    return allValues;
  }
}

我想不出一種方法來存儲 Enum class 以便以后可以從中獲取值列表。 有什么線索嗎?

而不是使用EnumSet ,我認為使用Class#getEnumConstants更清潔。 這將返回一個枚舉對象數組。

            for (Enum enumValue : clazz.getEnumConstants()) {
                allValues += " " + enumValue.name();
            }

請注意,如果clazz不是Enum ,則此代碼將NPE

您可以通過 tgdavies 擴展正確的答案,以獲得一Set 不可修改的枚舉對象。

Class#getEnumConstants返回的枚舉對象數組傳遞給Set.of方法。

這是一個等效於您的代碼示例Set.of( Animal.CAT.clazz.getEnumConstants() ); .

Set< Month > months = Set.of( Month.class.getEnumConstants() ) ;  // Pass array of enum objects to `Set.of` to produce an unmodifiable set.
        
System.out.println( "months: " + months ) ;

請參閱在 IdeOne.com 上實時運行的代碼

月:[1月、5月、11月、12月、3月、10月、6月、4月、8月、7月、9月、2月]

我完全忽略了您需要另一個枚舉值。

既然枚舉構造函數無論如何都是私有的,為什么要通過傳遞 Class object 來讓你的生活變得艱難? 只需傳遞值即可。 只要您的枚舉包含至少一個值,這應該可以工作:

enum Animal {
    DOG(DayOfWeek.values()),
    CAT(Month.values());

    public final Class<? extends Enum<?>> clazz;
    private final Enum<?>[] values;

    <T extends Enum<T>> Animal(T[] values) {
        this.clazz = (Class<? extends Enum<?>>) values[0].getClass();
        this.values = values;
    }

    public String getValuesConcat() {
        return Arrays.stream(values).map(Enum::name).collect(Collectors.joining(" "));
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM