2017-12-20 9 views
-1

列挙型に整数フィールドがあり、各列挙型定数が一意のフィールド値を持つようにしたいとします。それについてどうやって行きますか?列挙型フィールドの値が一意であることを確認する方法は?

+0

を実際に、ええ - このQ/Aは、それが既存の問題+解答でカバーされていない何を追加するのでしょうか? –

+0

@OliverCharlesworthこの質問は、2つの列挙型の定数間の1-1対応に関するものです。答えの点では、その答えは他のenum型を扱うときにのみ適用できます。 –

答えて

0

は(Unique enum member valuesに触発さ)、静的初期化子を使用します

enum MyEnum { 
    CONST_1(5); //... 
    private int code; 
    public MyEnum(int code) { 
     this.code = code; 
    } 
    public int getCode() { 
     return this.code; 
    } // ... 

    static { 
     // check that the codes are unique. 
     if (Arrays.stream(MyEnum.values()).map(MyEnum::getCode).distinct() 
      .count() != MyEnum.values().length) 
     throw new IllegalStateException("Codes aren't unique."); 
    } 
} 
+0

すべての列挙型の値が初期化された後に 'static'ブロック*が*実行されることが保証されていますか? –

+2

私はそれが実行時に行われるべきものではないと思います。単体テストはこの種のものを主張するように設計されています。あなたは列挙型のためにそれを行いますが、複数のものをチェックすることもできます。ランタイムコードはテストコードではありません。使用された構造が必要なチェックを提供しない場合、私はユニットテストを書く。 – davidxxx

+0

@OliverCharlesworth私はちょうどそれを試み、それは働いた。しかし、私はより慎重に仕様を調べる必要があります。 –

関連する問題