2016-12-31 3 views
2

マップのキーセットを列挙型で検証する必要があるマップがあります。enumでマップのキーセットを検証するエレガントな方法?

public enum Tag { 
    rename, duplicate, process, limit, encode, decode; 
    }; 

今マップのkeyset列挙型以上の値を持つ必要があります:私は、以下のように列挙型クラスを持っています。私のキーセットにenumにない値が含まれている場合、IllegalArgumentExceptionを値に設定してenumから抜け出したいと思います。

以下は私のコードです:

public Processor(Map<String, String> tasks) { 
    Set<String> keyset = tasks.keySet(); 
    for (String tag : keyset) 
     checkArgument(!EnumUtils.isValidEnum(Tag.class, tag), "unknown tag found '%s'.", tag); 
    } 

あなたは私がkeysetを反復してPreconditions.checkArgumentチェックをやって見ることができるように。それがなければIllegalArgumentExceptionを投げます。私は確信してメッセージを改善することができます確信しています。

私の質問です:同じことを私がやっていることと比較してより良い方法がありますか?チェックのためにforループ内のkeysetを反復処理する必要がありますか?またはこのバリデーションを行うためのライナーや他の方法がありますか?

私はJava7を使用しています。

+1

マップに 'Tag'列挙からのキーを持たせたいのであれば、本当に' Map 'であってはなりません。 – user2357112

+1

'Map 'を使うだけですか?たぶん 'EnumMap'ですか? – chrylis

答えて

6

あまりにも多くの作業をしています。現実的に言えば、マップ内のキーをTagにバインドするだけです。缶に渡されたマップ内のキーのみこれまでTagことが

public Processor(Map<Tag, String> tasks) { 
    // processor logic  
} 

この保証。無効なキーが渡された場合、コードがコンパイルに失敗するため、このスキームでは例外は必要ありません。また、それは列挙型なので、その列挙型にないキーは取得しません。

文字列のリストを処理していて、列挙型を直接取得できない場合は、Tag.valueOf("<string value here>")を使用して変換できます。

+0

ユーザーがIllegalArgumentExceptionをスローしたい場合...どこにコードがスローされますか? – prashant

+1

@prashantあなたはそれを投げる必要はありません。これにより、ランタイムチェックではなくコンパイル時のチェックがマップに与えられます。私たちはこれをすでにあなたの答えに織り込んできました。私はここでそれを再ハッシュする理由は見ません。 – Makoto

+0

しかし、ユーザーが@Makotoをスローしたい....それは彼がそのようなイベントを追跡したいビジネスケースのためかもしれない.....私が対処してきたユーザーの必要性......は – prashant

関連する問題