枚举类型与数字常量

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

枚举应该被用作常量而不是动态值。最好使用自己的实现。 - Abhishek
@Abhishek,使用枚举来表示已知和有限范围的(原始)值是一种良好且完全有效的做法。 - Péter Török
@peter-torok 我同意有限的范围,但他正在尝试从数据库中检索值,因此我的假设是值是未知的,只知道范围(A-Z和0-9)。 - Abhishek
2个回答

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项。

谢谢你的帮助。我还需要能够打印每个值的描述,所以我想我可以这样做:ANTIQUE('A',“古董”),并更新构造函数。 - Tom
@Tom,确实,您可以自由地向Java枚举添加更多属性(甚至是多态行为)。 - Péter Török

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接