我需要能够从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!";
}
}
}
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法来处理这个?
kan*_*kan 21
枚举值具有FOO.ordinal()函数是值的数字表示.该函数返回零之间,其数量n-1在那里n-很多枚举值怎么做你.然后您可以使用types.values()[i]按数字检索值.但是你应该记住,不允许在中间重新排序或添加新的枚举,因为数字会被改变.
此外,您可以使用types.valueOf("FOO")和FOO.name()表示枚举值的字符串表示形式.它使用起来更安全,因为它不依赖于声明顺序.
您可以使用枚举名称进行存储和检索.
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;
}
Run Code Online (Sandbox Code Playgroud)
如果它对性能至关重要,则可以将所有类型放入静态映射中,并将"值"作为键.然后你不需要循环而只说valueMap.get(value).应该在枚举中的静态块中初始化映射.
对于额外的文本值,您可以使用getter为枚举提供类型为String的第二个成员变量.因此,关联的int和String值仅在初始化中.
例如,
FOO(0,"Hello I'm Foo"),
BAA(1,"Hello I'm Baa"),
...
Run Code Online (Sandbox Code Playgroud)