Anteriormente, eu tinha minhas enums LegNo definidas simplesmente como:
NO_LEG, LEG_ONE, LEG_TWO
e, ao ligar return LegNo.values()[i];
, consegui obter o valor associado a cada enum.
Mas agora eu decidi que quero que o LegNo
enum NO_LEG
seja o int -1 em vez de 0, então decidi usar um construtor privado para inicializar e definir seu valor int
NO_LEG(-1), LEG_ONE(1), LEG_TWO(2);
private LegNo(final int leg) { legNo = leg; }
a única coisa agora é que, como estou fazendo dessa maneira, o values()
método não funcionará para o NO_LEG
enum. Como faço para obter o enum associado ao int? Existe alguma maneira eficiente de fazer isso além de usar uma instrução case switch ou if-elseif-elseif
Eu posso ver um monte de perguntas SO relacionadas com a obtenção do valor int do enum, mas estou atrás do contrário.
LegNo foo = LegNo.valueOf(2);
. O código anterior retornará aLegNo.LEG_TWO
.null
, conforme esperado usando HashMap.get : Retorna o valor para o qual a chave especificada está mapeada, ou nulo se este mapa não contém mapeamento para a chave.valueOf()
usando um enum de 1000 membros dentro de outro loop.Você também pode incluir um método estático no enum que itera por meio de todos os membros e retorna o correto.
Agora, se você quiser obter um valor Enum pelo inteiro, basta usar:
fonte
Resposta de adarshr adaptada para Java 8:
fonte
Você também pode acessar o valor Enum correspondente ao valor inteiro fornecido simplesmente chamando o método values () no enum LegNo. Ele retorna o campo de enums LegNo:
LegNo.values()[0]; //returns LEG_NO LegNo.values()[1]; //returns LEG_ONE LegNo.values()[2]; //returns LEG_TWO
Não exatamente o que ele estava procurando, mas bem parecido e muito simples. (Embora o assunto esteja morto, pode ser útil para outra pessoa.)
fonte
Java 8 way com valor padrão:
chamar:
ou com exceção:
fonte
Como seu enum contém apenas 3 elementos, a maneira mais rápida será usar apenas uma série de
if else
, como você sugeriu.editar: a resposta que adarshr forneceu é mais adequada para casos gerais, onde há muitos valores enum, mas acho que é um exagero para o seu problema.
fonte
Map
em seu código certamente não é um exagero. Além disso, torna o método muito mais limpo do que um espaguete de condições if-else.public LegNo valueOf(int value)
não deve ser alterada. O if-else poderia então ser escrito dentro do próprio enum. Se o if-else sair do enum, ele certamente se tornará um código não tão limpo.fonte
fonte