[英]Generic enum iterator java
我的枚舉
public enum ExamStausEnum {
RESULTAWAITED("Result Awaiting"),
PASSED("Passed"),
FAILED("Failed");
private String value;
ExamStausEnum(String value) {
this.value = value;
}
@JsonValue
public String getValue() {
return value;
}
}
通用迭代器枚舉
static <E extends Enum <E>> void foo(Class<E> elemType) {
for (E e : java.util.EnumSet.allOf(elemType)) {
System.out.println(e);
}
}
結果:
RESULTAWAITED
PASSED
FAILED
如何打印構造函數值?
Result Awaiting
Passed
Failed
不可避免地要添加另一個參數來抽象getValue()
調用:
static <E extends Enum <E>> void foo(Class<E> elemType, Function<? super E, ?> f) {
for(E e : java.util.EnumSet.allOf(elemType)) {
System.out.println(f.apply(e));
}
}
然后,您可以調用不一定具有該方法的任意enum
類型,例如
foo(Thread.State.class, Object::toString);
或對於具有以下方法的特定enum
:
foo(ExamStausEnum.class, ExamStausEnum::getValue);
可能還有更多用例:
foo(Thread.State.class, Enum::name);
要么
foo(ExamStausEnum.class, Enum::ordinal);
當然,您還可以讓您的ExamStausEnum
類型覆蓋toString()
方法,從而無需foo
來調用getValue()
方法。
更先進的方法是創建一個接口,聲明所有枚舉實現的getValue()
方法。
interface EnumWithValue{
@JsonValue
String getValue();
}
public enum ExamStausEnum implements EnumWithValue {
RESULTAWAITED("Result Awaiting"),
PASSED("Passed"),
FAILED("Failed");
private String value;
ExamStausEnum(String value) {
this.value = value;
}
@Override
public String getValue() {
return value;
}
}
然后可以將您的枚舉轉換為foo
:
static <E extends Enum <E>> void foo(Class<E> elemType) {
for (E e : java.util.EnumSet.allOf(elemType)) {
System.out.println(((EnumWithValue)e).getValue());
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.