大家好.所以我有一组枚举和一个带有与这些枚举相对应的整数的数据库.像这样的东西,例如:
public static enum Day {
SUNDAY(1), MONDAY(2), TUESDAY(3), WEDNESDAY(4), THURSDAY(5), FRIDAY(6), SATURDAY(7);
public final int fId;
private Day(int id) {
this.fId = id;
}
}
Run Code Online (Sandbox Code Playgroud)
我还有一个数据库,它只引用这些天的整数,它们对应于上面枚举集中的int.我要做的是查询一个数据库,它将返回一个整数,然后根据从db返回的整数将枚举数设置为一个对象.我可以这样做:
public static Day getDay(int i) {
switch(i) {
case 1:
return Day.SUNDAY;
case 2:
return Day.MONDAY;
//And so on
}
}
Run Code Online (Sandbox Code Playgroud)
但对于一个包含100多个枚举的枚举,这似乎不太实用.
有没有办法做到这一点?我的目标是简单地插入一个int值并返回一个枚举器,而不必为这个集合中的许多枚举创建一个新方法.也许我应该把它作为自己的类而不是枚举器,但我希望这样做.谢谢!
Boh*_*ian 11
这是一个简单的实现:
public static enum Day {
SUNDAY(1), MONDAY(2), TUESDAY(3), WEDNESDAY(4), THURSDAY(5), FRIDAY(6), SATURDAY(7);
public final int fId;
private Day(int id) {
this.fId = id;
}
public static Day forInt(int id) {
for (Day day : values()) {
if (day.fId == id) {
return day;
}
}
throw new IllegalArgumentException("Invalid Day id: " + id);
}
}
Run Code Online (Sandbox Code Playgroud)
如果你知道你的枚举从1开始计数,你可以简单地使用它:
public static Day forInt(int id) {
return values()[id - 1];
}
Run Code Online (Sandbox Code Playgroud)
枚举有一个内置的ID号,即"序数",您可以将其用于此目的,只要您有一种简单的方法可以从表示数据库中给定值的数字到枚举的序数.对于枚举值,它们在源文件中声明的顺序分配给枚举值,从0开始,因此在您的示例中,SUNDAY序数为0,MONDAY为1,等等.
为了使用它,您只需将存储在数据库中的整数转换为其对应的序数,然后使用它来访问枚举值.因此,对于您的示例,可能是实现
private static Day[] values = Day.values();
public static Day getDay(int i) {
return values[i - 1];
}
Run Code Online (Sandbox Code Playgroud)
如果根据其数据库ID的枚举值的顺序与它们在源代码中声明的顺序相同,那么您几乎可以按原样使用上述方法(除了更改类名).否则,您可能需要做一些更复杂的事情来将数据库值映射到序数; 如果映射是高度非线性的,可能会设置一个数组.
PS当然,如果你这样做,那么这个fId领域就没用了.
你的枚举类应该有一个内置的查找映射作为静态变量.因此你的枚举类应该是这样的.
public static enum Day {
SUNDAY(1), MONDAY(2), TUESDAY(3), WEDNESDAY(4), THURSDAY(5), FRIDAY(6), SATURDAY(7);
public final int fId;
private Day(int id) {
this.fId = id;
}
private static final Map<Integer, Day > lookup
= new HashMap<Integer, Day >();
static {
for (Day s : EnumSet.allOf(Day.class))
lookup.put(s.getIntValue(), s);
}
public static Day getValue(int intValue) {
return lookup.get(intValue);
}
}
Run Code Online (Sandbox Code Playgroud)
然后,要根据int i检索正确的枚举,您只需调用即可
Day.getValue(i);
Run Code Online (Sandbox Code Playgroud)
即使编号是非线性的或在其中存在间隙,该方法也将起作用.
| 归档时间: |
|
| 查看次数: |
18625 次 |
| 最近记录: |