2016-12-31 2 views
2

J'ai une carte dans laquelle j'ai besoin de valider le jeu de clés de la carte avec mon énumération. J'ai une classe enum comme indiqué ci-dessous:Une façon élégante de valider le jeu de clés d'une carte avec une énumération?

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

maintenant keyset de carte doit avoir des valeurs de ENUM ci-dessus. Si mon jeu de clés contient une valeur qui n'est pas présente dans l'énumération, alors je veux lancer IllegalArgumentException avec la valeur manquante dans mon énumération.

Ci-dessous mon code:

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); 
    } 

Comme vous pouvez le voir, je suis itérer keyset et de faire Preconditions.checkArgument chèque. Si ce n'est pas le cas, il lancera IllegalArgumentException. Je suis sûr que le message de lancement peut être amélioré.

Ma question est: Y at-il une meilleure façon de faire la même chose par rapport à ce que je fais? Dois-je itérer le keyset dans la boucle for pour faire le contrôle? ou Y a-t-il un seul paquebot ou un autre moyen de faire cette validation?

J'utilise Java7.

+1

Si vous voulez que votre carte possède des clés de l'enum 'Tag', ce ne devrait pas être une' Map '. – user2357112

+1

Il suffit d'utiliser un 'Map '? Peut-être même un 'EnumMap'? – chrylis

Répondre

6

Vous faites un peu trop de travail. De manière réaliste, tout ce que vous devez faire est de lier votre clé dans votre carte à Tag.

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

Ce garantit que les clés de la carte passé au can ne jamais Tag. Vous n'avez également pas besoin de l'exception dans ce schéma, car votre code échouera à compiler si une clé non valide est transmise. En outre, puisque c'est une énumération, vous n'obtiendrez pas de clés qui ne sont pas dans cette énumération.

Si vous traitez une liste de chaînes et que vous ne pouvez pas obtenir l'énumération directement, vous pouvez utiliser Tag.valueOf("<string value here>") pour le convertir.

+0

L'utilisateur veut lancer IllegalArgumentException ... où est-ce jeté dans votre code ????? – prashant

+1

@prashant Vous n'avez pas besoin de le lancer. Cela donne une vérification de temps de compilation à la carte plutôt qu'une vérification d'exécution. Nous avons déjà parlé de cela dans votre réponse et je ne vois aucune raison de le répéter ici. – Makoto

+0

Mais l'utilisateur veut jeter @Makoto .... il pourrait être pour une analyse de rentabilisation où il veut suivre de tels événements ..... – prashant