2011-04-21 127 views
5

我從舊系統獲取數據,其中某個字節字段是可能包含字母或數字的代碼。我想將它映射到一個枚舉,但我不知道如何處理數值。帶數字常量的枚舉類型

public enum UsageCode { 
    A ("Antique"), 
    F ("Flood Damaged"), 
    N ("New"); 
// 0 ("Unknown") How to allow for value of "0"? 

    private final String description; 

    UsageCode(String description) { 
     this.description = description; 
    } 

    public String getDescription() { 
     return description; 
    } 
} 
+0

ENUMS應作爲常量,而不是作爲動態值。你應該更好地使用自己的實現。 – Abhishek 2011-04-21 16:06:56

+0

@Abhishek,用枚舉表示一個已知和有限範圍的(原始)值是一種很好且完全有效的做法。 – 2011-04-21 16:10:44

+0

@ peter-torok我同意有限範圍,但他試圖從數據庫中檢索te值,所以我的假設是隻知道範圍(A-Z&0-9)的值是未知的。 – Abhishek 2011-04-21 16:15:58

回答

7

把它裏面出來:

public enum UsageCode { 
    ANTIQUE ('A'), 
    FLOOD_DAMAGED ('F'), 
    NEW ('N'); 
    UNKNOWN ('0') 

    private static final Map<Character, UsageCode> charToEnum 
      = new HashMap<Character, UsageCode>(); 

    static { // Initialize map from legacy code to enum constant 
     for (UsageCode code : values()) 
     charToEnum.put(code.getCode(), code); 
    } 

    // Returns UsageCode for legacy character code, or null if code is invalid 
    public static UsageCode fromLegacyCode(char code) { 
     return charToEnum.get(code); 
    } 

    private final char code; 

    UsageCode(char code) { 
     this.code = code; 
    } 

    public char getCode() { 
     return code; 
    } 
} 

用於轉換輸入字符碼到枚舉值,我添加內Map<Character, UsageCode>和靜態轉換方法。

實施例改編自Effective Java 2nd Edition,第30項。

+0

感謝您的幫助。我也需要能夠打印每個值的描述,所以我想我可以這樣:ANTIQUE('A',「Antique」)並更新構造函數。 – Tom 2011-04-21 16:46:51

+0

@Tom的確,您可以自由地將更多屬性(甚至是多態行爲)添加到您的Java枚舉中。 – 2011-04-21 16:48:42

5

可以做到這一點反過來,具有有意義的常數和存儲舊值表示:

public enum UsageCode { 

    ANTIQUE("A"), 
    FLOOD_DAMAGED("F"), 
    NEW("N"), 
    UNKNOWN("0"); 

    private String legacy; 

    private UsageCode(String legacy) { 
     this.legacy = legacy; 
    } 

    public static UsageCode toUsageCode(String legacyOutput) { 
     for(UsageCode code : values()) { 
     if (code.legacy.equals(legacyOutput)) { 
      return code; 
     } 
     } 
     return null; 
    } 
}