Auparavant, j'avais mes énumérations LegNo définies simplement comme:
NO_LEG, LEG_ONE, LEG_TWO
et en appelant return LegNo.values()[i];
, j'ai pu obtenir la valeur associée à chaque enum.
Mais maintenant, j'ai décidé que je veux que l' LegNo
énumération NO_LEG
soit le int -1 au lieu de 0, alors j'ai décidé d'utiliser un constructeur privé pour initialiser et définir sa valeur int
NO_LEG(-1), LEG_ONE(1), LEG_TWO(2);
private LegNo(final int leg) { legNo = leg; }
la seule chose maintenant est que parce que je le fais de cette façon, la values()
méthode ne fonctionnera pas pour l' NO_LEG
énumération. Comment puis-je obtenir l'énumération associée à l'int? Existe-t-il un moyen efficace de faire cela autre que d'utiliser une instruction case switch ou un if-elseif-elseif
Je peux voir beaucoup de questions SO liées à l'obtention de la valeur int à partir de l'énumération, mais je suis après l'inverse.
LegNo foo = LegNo.valueOf(2);
. Le code précédent renverra unLegNo.LEG_TWO
.null
, comme prévu en utilisant HashMap.get : Renvoie la valeur à laquelle la clé spécifiée est mappée, ou null si cette carte ne contient aucun mappage pour la clé.valueOf()
une énumération de 1000 membres dans une autre boucle.Vous pouvez également inclure une méthode statique dans l'énumération qui itère sur tous les membres et renvoie la méthode correcte.
Maintenant, si vous voulez obtenir une valeur Enum par l'entier, il vous suffit d'utiliser:
la source
La réponse d'adarshr adaptée à Java 8:
la source
Vous pouvez également accéder à la valeur Enum correspondant à une valeur entière donnée simplement en appelant la méthode values () sur enum LegNo. Il renvoie le champ d'énumérations LegNo:
LegNo.values()[0]; //returns LEG_NO LegNo.values()[1]; //returns LEG_ONE LegNo.values()[2]; //returns LEG_TWO
Pas exactement ce qu'il cherchait, mais assez proche et très simple en effet. (Bien que le sujet soit mort, il pourrait être utile pour quelqu'un d'autre.)
la source
Java 8 façon avec valeur par défaut:
appeler:
ou avec exception:
la source
Étant donné que votre énumération ne contient que 3 éléments, le moyen le plus rapide sera d'utiliser simplement une série de
if else
, comme vous l'avez suggéré.edit: la réponse fournie par adarshr est mieux adaptée aux cas généraux, où il existe de nombreuses valeurs d'énumération, mais je pense que c'est exagéré pour votre problème.
la source
Map
dans votre code n'est certainement pas exagéré. De plus, cela rend la méthode beaucoup plus propre qu'un spaghetti de conditions if-else.public LegNo valueOf(int value)
ne doit pas être modifiée. Le if-else pourrait alors être écrit dans l'énumération elle-même. Si le if-else sort de l'énumération, alors il devient certainement un code pas si propre.la source
la source