2011-11-24 57 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"), 
...