我在博客上看到它建议以下是使用getCode(int)Java枚举进行"反向查找"的合理方法:
public enum Status {
WAITING(0),
READY(1),
SKIPPED(-1),
COMPLETED(5);
private static final Map<Integer,Status> lookup
= new HashMap<Integer,Status>();
static {
for(Status s : EnumSet.allOf(Status.class))
lookup.put(s.getCode(), s);
}
private int code;
private Status(int code) {
this.code = code;
}
public int getCode() { return code; }
public static Status get(int code) {
return lookup.get(code);
}
}
Run Code Online (Sandbox Code Playgroud)
对我来说,静态地图和静态初始化程序看起来都是个坏主意,我的第一个想法就是将查询编码为:
public enum Status {
WAITING(0),
READY(1),
SKIPPED(-1),
COMPLETED(5);
private int code;
private Status(int code) {
this.code = code;
} …Run Code Online (Sandbox Code Playgroud) 我试图在运行时循环并打印给定枚举类的所有枚举值。但我似乎只能返回与值相关的常量。大多数解决方案都指向使用 getEnumConstants()、values() 或 valueOf(),但我无法让它们按预期工作。
我能找到的最接近的问题是Get value of enum by Reflection 和how-to-get-all-enum-values-in-java,但它们显然有足够的不同,以至于解决方案不符合我的要求。下面是我尝试过的代码以及自动生成且不可变的 ENUM 类:
Class cls = Class.forName("TestEnum");
for (Object obj : cls.getEnumConstants())
{
System.out.println(obj.toString()); //prints TEST___A (not TEST_1)
System.out.println(Enum.valueOf(cls, obj.toString())); //prints TEST___A (not TEST_1)
}
Run Code Online (Sandbox Code Playgroud)
和枚举:
@XmlType(name = "TestEnum")
@XmlEnum
public enum TestEnum {
@XmlEnumValue("TEST_1")
TEST___A("TEST_1"),
@XmlEnumValue("TEST_2")
TEST___B("TEST_2");
private final String value;
TestEnum(String v) {
value = v;
}
public String value() {
return value;
}
public static TestEnum fromValue(String v) {
for (TestEnum c: TestEnum.values()) { …Run Code Online (Sandbox Code Playgroud)