【问题标题】:Java Enums Enforce Uniqueness For A FieldJava 枚举强制字段的唯一性
【发布时间】:2017-01-23 20:34:23
【问题描述】:

我有一个简化形式的枚举,如下所示。

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

我的目标是强制当其他人编辑此枚举以添加新值时,例如 Code100Code100m_code 不应与之前的任何 @987654326 的 m_code 相同@-Code99。我能想到的唯一方法是为此枚举编写一个单元测试来进行检查。有没有更好的办法解决这个问题?

理想情况下,我希望在这种情况下出现编译时错误,但我不确定这是否可以在 Java 中完成?

【问题讨论】:

  • 我认为彼得的解决方案是最干净的。否则,我只会使用单元测试。通过正确设置持续集成,代码应该没有办法在未经测试的情况下转入生产环境。

标签: java design-patterns enums


【解决方案1】:

您的意思是您喜欢将m_code 作为唯一键处理?

试试

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

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

【讨论】:

  • 作为这篇文章的补充,他仍然可以保留 getCode() 方法并返回 this.name();
【解决方案2】:

如果可能的话,我会选择彼得的答案。如果必须将枚举值命名为 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;
}

【讨论】:

  • 在上述条件下完美。 cplusplusrat 简化了很多,如果我的答案与他的问题相匹配,那就是侥幸。无论如何,类是在加载时而不是在“运行时”加载的,也许这是一个极端情况,我们可能会抛出一个完整的错误(多么令人震惊 - 谁说的!;D)。
【解决方案3】:

将需要唯一的东西粘贴到静态集中,并检查您是否在构造函数中添加了它,以便在加载时完成所有操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-19
    • 2021-12-22
    • 1970-01-01
    • 1970-01-01
    • 2013-01-15
    • 2019-04-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多