Java 枚举到字符串映射保持一致性

标签 java enums

我是 Java 新手,正在为 header 编写枚举到字符串映射。

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 将枚举转换为 header 名称。如您所见,添加另一种 header 类型也涉及将其添加到 map 中。所以这个的用户应该确保它被添加到两个地方以避免以后出现任何困惑。对于此功能,他们有任何干净的替代品吗?

最佳答案

您可以使 header 名称成为 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().

您可以使用 enumvalues() 方法枚举所有类型/名称组合:

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

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

关于Java 枚举到字符串映射保持一致性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35615782/

相关文章:

Java 打印编写器 : Why do we handle FileNotFoundException if the file is automatically created if not found?

java - 直接调用 Future#get(time, timeunit) (不检查 isDone())是一种不好的做法吗?

Angular2 在 html 值属性中使用枚举值

java - 如何检查 Java 中的泛型枚举?

java - 将自定义http header 添加到Spring Boot WS调用(wstemplate)

java - Google Map Android API 可以加载的最大 KML 文件大小

Java Swing 制作开/关按钮

c++ - 如何将枚举类型的数据保存到文件?

c# - 枚举的 DropDownList 问题

c# - 将枚举传递给函数