在我使用此数据库的数据库中,我想要映射到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)));
但我会对任何和所有替代方案感兴趣。
答案 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
。与x
和1
相同。等等。
答案 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;
}