2011-11-24 17 views
11

我需要能够存储和检索从SQLite数据库,我已经解决了包装类和枚举的联合使用枚举,但我觉得它的设计很差。存储和检索SQLite与Java中的枚举

每当我想添加一个新项目到枚举列表中,我必须将它添加到三个不同的地方。

枚举必须包含:

  • 一个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!"; 
     } 
    } 
} 

有没有更好的方法来处理这个问题?

回答

21

的枚举值具有FOO.ordinal()函数是一个值的数字表示。该函数返回0到n-1之间的数字,其中n - 您有多少枚举值。然后,您可以使用types.values()[i]按数字检索返回的值。但是您应该记住,不允许在中间重新排序或添加新枚举,因为数字将会更改。

此外,您可以使用types.valueOf("FOO")FOO.name()作为枚举值的字符串表示形式。使用更安全,因为它不依赖于声明顺序。

+1

但如果你打算把枚举存储到字符串中,你千万不要改变枚举值的名字..每一个都有它的优点和缺点 – yeahman

+0

我想使用序数更危险,因为我们可以很容易地添加一个新的枚举类型之间。但改名字的可能性要小一些。那么多数民众赞成在我的感受,我可能是错误的 –

+1

@RahulVerma只是与测试覆盖如果重要 - 没有风险。但是存储单个“int”值通常比字符串更有效。 – kan

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; 
} 

如果性能是至关重要的,你可以把所有的类型分为静态地图与“价值”作为关键。那么你不需要循环,只说valueMap.get(value)。映射应该在枚举中的一个静态块中初始化。

对于额外的文本值,你可以给一个类型为String的枚举的第二个成员变量和一个getter。所以关联的int和String值只在初始化中。

例如,

FOO(0,"Hello I'm Foo"), 
BAA(1,"Hello I'm Baa"), 
...