我需要能够从SQLite数据库中存储和检索枚举,我已经通过结合使用包装类和枚举来解决这个问题,但我觉得它的设计非常糟糕。
每次我想在枚举列表中添加新项目时,我都必须将其添加到三个不同的位置。
枚举必须包含:
目前实施方式如下:
public class items
{
public enum types {
FOO(0),
BAR(1),
BAZ(2);
private final int _value;
types(int value){_value = value;}
public int value(){return _value;}
}
public static types Get(int i)
{
switch(i)
{
case 0:
return types.FOO;
case 1:
return types.BAR;
case 2:
return types.BAZ;
default:
return null;
}
}
public static String Get(Typer type)
{
switch(type)
{
case FOO:
return "This is foo!";
case BAR:
return "This is bar!";
case BAZ:
return "This is baz!";
default:
return "No good!";
}
}
}
有没有更好的方法来解决这个问题?
答案 0 :(得分:21)
枚举值具有FOO.ordinal()
函数是值的数字表示。该函数返回零到n-1
之间的数字n
- 你有多少枚举值。然后,您可以使用types.values()[i]
按数字检索值。但是你应该记住,不允许在中间重新排序或添加新的枚举,因为数字会被更改。
此外,您可以使用types.valueOf("FOO")
和FOO.name()
作为枚举值的字符串表示形式。它使用起来更安全,因为它不依赖于声明顺序。
答案 1 :(得分:6)
您可以使用枚举名称进行存储和检索。
types.valueOf("FOO")
应提供types.FOO
,types.FOO.name()
会为您提供枚举的名称。
如果要通过成员变量检索它,可以执行以下操作:
public static Types byValue(final int value) {
Types returnvalue = FOO; // default returnvalue
for (final Types type : Types.values()) {
if (type.value == value) {
returnvalue = type;
break;
}
}
return returnvalue;
}
如果性能至关重要,可以将所有类型放入静态地图中,并将“值”作为关键字。然后你不需要循环并只说valueMap.get(value)
。应该在枚举中的静态块中初始化映射。
对于额外的文本值,您可以使用getter为枚举提供类型为String的第二个成员变量。因此,关联的int和String值仅在初始化中。
例如,
FOO(0,"Hello I'm Foo"),
BAA(1,"Hello I'm Baa"),
...