将幻数映射到枚举值,反之亦然

时间:2014-07-07 07:14:05

标签: java enums magic-numbers

在我使用此数据库的数据库中,我想要映射到State枚举的幻数,反之亦然。我对undefined.code = 0的静态声明很感兴趣。这个宣言究竟是什么呢?

package net.bounceme.dur.data;

public enum State {

    undefined(0), x(1), o(2), c(3), a(4), l(5), d(6);
    private int code = 0;

    static {
        undefined.code = 0;
        x.code = 1;
        o.code = 2;
        c.code = 3;
        a.code = 4;
        l.code = 5;
        d.code = 6;
    }

    State(int code) {
        this.code = code;
    }

    public int getCode() {
        return this.code;
    }

    public static State getState(int code) {
        for (State state : State.values()) {
            if (state.getCode() == code) {
                return state;
            }
        }
        return undefined;
    }

}

目前,此枚举工厂方法的用法如下:

  title.setState(State.getState(resultSet.getInt(5)));

但我会对任何和所有替代方案感兴趣。

4 个答案:

答案 0 :(得分:4)

我删除了无用的静态块并改进了反函数。

public enum State {

private static Map<Integer,State> int2state = new HashMap<>();

undefined(0), x(1), o(2), c(3), a(4), l(5), d(6);
private int code;

State(int code) {   // executed for *each* enum constant
    this.code = code;
    int2state.put( code, this ); 
}

public int getCode() {
    return this.code;
}

public static State getState(int code) {
    return int2state.get(code);
}
}

如果“代码”整数绝对是从0开始的序数,你可以省略构造函数参数,私有int代码和映射,如下所示:

int2state.put( this.ordinal(), this );

答案 1 :(得分:2)

在您发布的代码中,静态块行

undefined.code = 0;

它访问枚举常量undefined,并盲目地将可变字段code的值从0设置为0。基本上,常量是在这里定义的

undefined(0)

代码为0。与x1相同。等等。

答案 2 :(得分:2)

它确实与构造函数完全相同 - 设置code关联每个枚举值。

在您的示例中,static { ... }块是多余的(不必要的),应该删除,因为它复制了以underfined(0)开头的行。

Enum用法变得棘手的点是查找(在您的情况下,getState(...)方法)。这里的case语句实际上是第三次复制代码,您可能最好构建一个Map来获取代码(int)并返回枚举(State ) - 只是google周围,有很多关于如何做到这一点的例子。

答案 3 :(得分:2)

只是一个提示。将getState(int)方法更改为

更具可读性
    public static State getState(int code) {
        for (State state : State.values()) {
            if (state.getCode() == code) {
                return state;
            }
        }
        return undefined; 
    }