Java Enum to String Map保持一致性

时间:2016-02-25 00:08:32

标签: java enums

我是Java新手,正致力于为标题编写Enum to String Map。

public class Header {

    // When adding HeaderType make sure it is consistent with the header name map
    public enum HeaderType {
        MARKER,
        WIDTH,
        ......
    };

    private String name;
    private String value;
    private HeaderType headerType;

    // Create an immutable map for header enum to header names
    private static final Map<HeaderType, String> headerNameMap;
    static {
        Map<HeaderType, String> headerNameMapTemp = new HashMap<HeaderType, String>();
        headerNameMapTemp.put(HeaderType.MARKER, "MA");
        headerNameMapTemp.put(HeaderType.WIDTH, "WI");
        headerNameMap = Collections.unmodifiableMap(headerNameMapTemp);
    }

    public Header(HeaderType headerType, String value) {
        this.headerType = headerType;
        this.name = Header.getHeaderName(this.headerType);
        this.value = value;
    }

    private static String getHeaderName(HeaderType headerType) {
        return headerName.get(headerType);
    }

在上面的代码中,我使用了HeaderType枚举,并使用不可变的HashMap将枚举转换为头名。正如您所看到的,添加另一个标题类型也会将其添加到地图中。因此,用户应确保将其添加到两个地方以避免以后出现任何混乱。他们是否有这种功能的干净选择?

1 个答案:

答案 0 :(得分:6)

您可以将标题名称设为enum本身的字段,如下所示:

public enum HeaderType {
    MARKER("MA"),
    WIDTH("WI");
    // FOO(), BAR; Won't compile

    private final String name;

    private HeaderType(String name) {
        this.name = name;   
    }

    public String getName() {
        return this.name;
    }
}

这样一来,如果不指定相应的名称,就无法添加新的HeaderType,而getHeaderName方法可以简单地替换为getName()的调用。

您可以使用enum&#39; values()方法枚举所有类型/名称组合:

for (HeaderType headerType : HeaderType.values()) {
    System.out.println(headerType.getName());
}

正在运行示例:https://ideone.com/B5LwQz