Java枚举强制字段

时间:2017-01-23 20:34:23

标签: java design-patterns enums

我有一个枚举,简化形式就像这样。

public enum Codes{
    Code1("someCode1", "someState"),
    Code2("someCode2", "someState"),
    ...
    ...
    private final String m_code;
    private final String m_state;       
}

我的目标是强制执行当其他人编辑此枚举以添加新值时,例如Code100m_code的{​​{1}}不应与Code100相同}对于之前的任何m_code - Code1。我能想到的唯一方法是为这个枚举编写一个单元测试来进行检查。这个问题有更好的解决方案吗?

理想情况下,我会喜欢这种情况的编译时错误,但我不确定这可以用Java完成吗?

3 个答案:

答案 0 :(得分:4)

您的意思是您希望将m_code作为唯一键处理?

尝试

public enum Codes{
  someCode1("someState"),
  someCode2("someState"),
  ...
  ...
  private final String m_state;       
}

enum的名称始终是唯一的。违规比测试早,比运行早,比编译,违规中断语法检查。

答案 1 :(得分:1)

如果可能的话,我会和彼得的回答一起去。如果您必须将您的枚举值命名为Code1到Code99,则可以在加载类后立即强制执行唯一性:

public enum Codes {
    CODE1("someCode1", "someState"),
    CODE2("someCode2", "someState"),
    //...
    //...
    CODE99("someCode99", "someState");

    static {
        Set<String> codes = new HashSet<>();
        for (Codes value : values()) {
            if (!codes.add(value.code)) {
                throw new RuntimeException(
                    "Duplicate code string value: \"" + value.code + "\"");
            }
        }
    }

    private final String code;
    private final String state;
}

答案 2 :(得分:0)

坚持静态集中唯一需要的东西,并检查你是否在构造函数中添加了它,所以它都是在加载时完成的。