Les meilleures pratiques pour rechercher Java Enum
Nous avons une API REST, où les clients peuvent fournir des paramètres représentant les valeurs définies sur le serveur en Java Enums.
Afin de fournir une description de l'erreur, nous ajoutons cette lookup
méthode pour chaque Enum. Semble que nous sommes simplement de copier le code (bad). Est-il préférable?
public enum MyEnum {
A, B, C, D;
public static MyEnum lookup(String id) {
try {
return MyEnum.valueOf(id);
} catch (IllegalArgumentException e) {
throw new RuntimeException("Invalid value for my enum blah blah: " + id);
}
}
}
Mise à jour: par défaut, Le message d'erreur fourni par valueOf(..)
serait No enum const class a.b.c.MyEnum.BadValue
. Je voudrais donner une description de l'erreur à partir de l'API.
- Eh bien, il n'y a rien de mal avec le IllegalArgumentException, ce qui est déjà une RuntimeException. Que voulez-vous améliorer ici ?
- Ajoutez un message descriptif de celui qui est prévu quand il vient à l'aide de
valueOf
(etIllegalArgumentException
)
Vous devez vous connecter pour publier un commentaire.
Probablement, vous pouvez mettre en œuvre statique générique
lookup
méthode.Comme
Alors vous pouvez
ou appeler explicitement classe utilitaire méthode de recherche.
IllegalArgumentException
dans un runtime exception levée par une classe utilitaire...pour quel gain? La valeur par défaut exception levée par levalueOf()
mise en œuvre dans l'Enum est suffisant: il donne le type non valide c'est à dire l'entrée dans le cadre de l'exception de message.// log error or something here
)RuntimeException
au lieu d'uneIllegalArgumentException
? Ce dernier qui semble le plus adapté pour moi (et apparemment les concepteurs devalueOf
parce que c'est ce qu'ils utilisent).Enum.valueOf(MyEnum.class, id)
, il vous suffit d'appelerMyEnum.valueOf(id)
. DepuisIllegalArgumentException
est plus approprié queRuntimeException
il n'est pas nécessaire pour que l'utilité de la méthode à tous.Semble que vous avez une mauvaise pratique ici, mais pas là où vous le pensez.
De la capture d'un
IllegalArgumentException
renvoyer un autreRuntimeException
avec un message plus clair pourrait sembler une bonne idée, mais il ne l'est pas. Parce qu'il signifie que vous vous souciez de messages dans vos exceptions.Si vous vous souciez de messages dans vos exceptions, cela signifie que votre utilisateur est en quelque sorte de voir vos exceptions. Ce qui est mauvais.
Si vous souhaitez fournir un message d'erreur explicite à votre utilisateur, vous devez vérifier la validité de la valeur d'enum lors de l'analyse d'entrée de l'utilisateur et envoyer le message d'erreur approprié dans la réponse, si la saisie de l'utilisateur est incorrect.
Quelque chose comme:
Pourquoi faut-il écrire que 5 ligne de code ?
Si vous voulez la recherche pour être sensible à la casse, vous pouvez faire une boucle à travers les valeurs en faire un peu plus convivial:
lookup
vous n'êtes pas en train de retourner n'importe quelle valeur de la méthode.Nous faisons tout notre énumérations de ce genre quand il s'agit de Rest/Json etc.
Il a l'avantage que l'erreur est lisible par l'homme et vous donne également la valeur acceptée liste. Nous utilisons une méthode personnalisée MyEnum.fromString au lieu de MyEnum.valueOf, j'espère que ça aide.
ainsi, par exemple, si vous appelez
vous aurez une IllegalArgumentException avec le message suivant:
vous pouvez modifier la IllegalArgumentException à un programme personnalisé.
Goyave fournit également la fonction qui retourne un
Optional
si un enum ne peut pas être trouvé.Le message d'erreur dans IllegalArgumentException est déjà suffisamment descriptif.
Votre méthode générique exception de l'un spécifique avec le même message tout simplement reformulé. Un développeur préfère le d'exception, le type et peut traiter l'affaire de manière appropriée au lieu d'essayer de gérer les RuntimeException.
Si l'intention est de rendre le message plus convivial, les références à des valeurs de l'enum est pas pertinent pour eux de toute façon. Laissez-le code de l'INTERFACE utilisateur de déterminer ce qui doit être affiché à l'utilisateur et l'INTERFACE utilisateur développeur serait mieux avec de la IllegalArgumentException.
No enum const class a.b.c.MyEnum.BadValue
. Je préfère retourner un plus pertinent message d'erreur de l'API REST. Le développeur de la création de l'extrémité avant de ne pas vraiment savoir quoi faire avec l'erreur par défaut autre que de simplement afficher - qui est ce que je voudrais éviter.mise à jour: Comme GreenTurtle correctement fait remarquer, le suivant est incorrect
Je voudrais juste écrire
C'est peut-être moins performant que de rattraper une exception d'exécution, mais en fait beaucoup plus propre code. La capture de ces exceptions est toujours une mauvaise idée, car elle est sujette à des erreurs de diagnostic.
Ce qui se passe lors de la récupération de la contre valeur en lui-même provoque une IllegalArgumentException ? Ce serait alors soumis comme une non-valeur correspondante pour l'agent recenseur.
Vous pouvez utiliser un statique de la recherche de la carte pour éviter de l'exception et de retourner une valeur null, puis jetez-la comme vous le souhaitez:
Apache Commons Lang 3 contais la classe EnumUtils. Si vous n'utilisez pas Apache Commons dans vos projets, vous le faites mal. Vous êtes en train de réinventer la roue!
Il y a une douzaine de refroidir les méthodes que nous pourrions utiliser sans déclenche une Exception. Par exemple: