2017-01-23 63 views
4

我有一個簡化形式的枚舉看起來像這樣。Java的枚舉實現一個字段的唯一性

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

我的目標是強制執行,當其他人編輯此枚舉添加一個新的價值,說Code100,該m_codeCode100不應該是一樣m_code任何以前Code1 - Code99。我能想到的唯一方法就是爲這個枚舉編寫一個單元測試,它會做這個檢查。有沒有更好的解決這個問題?

理想情況下,我會喜歡這種情況的編譯時錯誤,但我不確定這可以在Java中完成嗎?

+0

彼得的解決方案是最乾淨的我認爲。否則,我只會使用單元測試。通過適當建立持續集成,代碼無法轉化爲未經測試的生產方式。 – Axel

回答

4

你的意思是你喜歡把m_code作爲一個獨特的鑰匙?

嘗試

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

enum的名字始終是唯一的。違反早於測試,早於運行,早於編譯,違反語法檢查中斷。

+1

作爲本文的補充,他仍然可以保留getCode()方法並返回this.name(); –

0

堅持任何需要在靜態集合中唯一的,並檢查您是否在構造函數中添加了它,因此它在加載時完成。

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; 
} 
+0

完美符合上述條件。 cplusplusrat簡化了很多,如果我的回答匹配他的問題,它是一個僥倖。無論如何,這個類是在加載時加載的,而不是在「運行時」,也許這是一個角落,我們可能會拋出一個完整的錯誤(什麼是震驚 - 誰說的這個!D)。 –