相关疑难解决方法(0)

Java枚举反向查找最佳实践

在博客上看到它建议以下是使用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)

java enums static-initializer

72
推荐指数
4
解决办法
4万
查看次数

通过反射获取枚举值

我试图在运行时循环并打印给定枚举类的所有枚举值。但我似乎只能返回与值相关的常量。大多数解决方案都指向使用 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)

java reflection enums jaxb

7
推荐指数
1
解决办法
1万
查看次数

标签 统计

enums ×2

java ×2

jaxb ×1

reflection ×1

static-initializer ×1