[英]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 ) ;
月:[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.