[英]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.