使用Java在SQLite中存储和检索枚举

Jan*_*aek 11 java enums

我需要能够从SQLite数据库中存储和检索枚举,我已经通过结合使用包装类和枚举来解决这个问题,但我觉得它的设计非常糟糕.

每次我想在枚举列表中添加新项目时,我都必须在三个不同的地方添加它.

枚举必须包含:

  • 一个int(或字符串)来表示它
  • 一个文本字符串,提供有关枚举本身的更多文本
  • 一种以某种方式从数据库中恢复其状态的方法

目前它实现如下:

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()表示枚举值的字符串表示形式.它使用起来更安全,因为它不依赖于声明顺序.

  • 但是如果要将枚举存储到字符串中,则绝对不能更改枚举值的名称..每个都有其优点和缺点 (2认同)
  • @RahulVerma 如果重要的话只需进行测试即可 - 并且没有风险。但存储单个“int”值通常比字符串更有效。 (2认同)

And*_*eas 6

您可以使用枚举名称进行存储和检索.

types.valueOf("FOO")应该传递types.FOOtypes.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)