【问题标题】:Java Enum to String Map maintaining consistencyJava Enum to String Map 保持一致性
【发布时间】:2016-02-25 00:08:31
【问题描述】:

我是 Java 新手,正在为标题编写一个 Enum 到 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 将枚举转换为标头名称。如您所见,添加另一种标头类型也涉及将其添加到地图中。所以这个用户应该确保它被添加到两个地方以避免以后出现任何混乱。他们有这个功能的任何干净的替代品吗?

【问题讨论】:

    标签: java enums


    【解决方案1】:

    您可以将标题名称设置为 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多