Qual é a maneira mais fácil e / ou curta possível de obter os nomes dos elementos enum como um array de String
s?
O que quero dizer com isso é que se, por exemplo, eu tivesse o seguinte enum:
public enum State {
NEW,
RUNNABLE,
BLOCKED,
WAITING,
TIMED_WAITING,
TERMINATED;
public static String[] names() {
// ...
}
}
o names()
método retornaria a matriz { "NEW", "RUNNABLE", "BLOCKED", "WAITING", "TIMED_WAITING", "TERMINATED" }
.
Respostas:
Aqui está uma linha para qualquer
enum
classe:O pré Java 8 ainda é de uma linha, embora menos elegante:
Que você chamaria assim:
Se você deseja algo simples para uma classe enum codificada:
fonte
e.getEnumConstants()
você pode usarYourEnumName.values()
YourEnumName.values()
está chamando um método estático na classe, que não pode ser reutilizado para qualquer enum. UsandogetEnumConstants()
funciona para qualquer classe enum. A ideia com este método é recriar um método utilitário que você pode chamar como a última linha da resposta.Class<? extends Enum<?>> e
?Crie uma
String[]
matriz para os nomes e chame ovalues()
método estático que retorna todos os valores enum e, em seguida, itere sobre os valores e preencha a matriz de nomes.fonte
values()
13 vezes, gerando um novo array a cada vez, em vez de armazenar o array em cache em uma variável local? Por que usar toString (), que pode ser substituído, em vez dename()
?name()
método até agora. que estúpido da minha parte: P obrigado por me avisar :)Aqui está uma solução elegante usando Apache Commons Lang 3 :
Embora retorne uma lista, você pode converter a lista facilmente com
list.toArray()
fonte
EnumUtils.getEnumList(enumClass)
retorna os valores enum, não as Strings. Você poderia usarEnumUtils.getEnumMap(enumClass).keySet()
, mas a ordem pode ser diferente.Se você pode usar Java 8, isso funciona bem (alternativa à sugestão de Yura, mais eficiente):
fonte
Com java 8:
fonte
Eu escreveria assim
fonte
Algo assim faria:
A documentação recomenda o uso em
toString()
vez dename()
na maioria dos casos , mas você pediu explicitamente o nome aqui.fonte
values()
é chamado duas vezes quando precisa ser chamado apenas uma vez.values()
é um método gerado pelo compilador, então acho que é bastante otimizado. Finalmente, lembro-me de ter lido em algum lugar que os loops for-each são mais eficientes do que os loops for incrementais padrão, mas, novamente - isso simplesmente não importa .for (int i = 0; i < a.length; i++) /* do stuff */;
neste caso, os loops for-each são , de fato, mais eficientes. Uma rápida pesquisa sobre o assunto nos dá o seguinte: stackoverflow.com/questions/2113216/…Outras maneiras:
Primeiro
Outro jeito
fonte
toString()
funciona, mas no caso geral isso não acontece, porquetoString()
pode ser ser substituído. Use.name()
para obter o nome da instância de forma confiável como String.Minha solução, com manipulação de strings (não é a mais rápida, mas é compacta):
fonte
Eu faria assim (mas provavelmente faria dos nomes um conjunto não modificável em vez de uma matriz):
fonte
names()
método é chamado apenas com moderação, acho que é bom gerar uma matriz no local.Tenho a mesma necessidade e uso um método genérico (dentro de uma classe ArrayUtils):
E basta definir um ESTÁTICO dentro do enum ...
Enums Java realmente perdem os métodos names () e get (index), eles são muito úteis.
fonte
a maneira comum (trocadilho intencional):
fonte
Fiz um pequeno teste na solução do @Bohemian. O desempenho é melhor ao usar o loop ingênuo.
fonte
org.apache.commons.lang3.EnumUtils.getEnumMap (State.class) .keySet ()
fonte
EnumUtils
?Se você quiser o mais curto, você pode tentar
fonte
vales()
uma vez)Apenas um pensamento: talvez você não precise criar um método para retornar os valores do enum como um array de strings.
Por que você precisa do array de strings? Talvez você só precise converter os valores ao usá-los, se precisar fazer isso.
Exemplos:
fonte
Outra maneira de fazer isso no Java 7 ou anterior seria usar o Guava:
fonte
Experimente isto:
fonte
Você pode colocar valores enum em uma lista de strings e convertê-los em array:
fonte
A maneira mais fácil:
Onde a categoria é o
Enum
nomefonte