Digamos que eu tenho uma enumeração que é apenas
public enum Blah {
A, B, C, D
}
e eu gostaria de encontrar o valor enum de uma string, por exemplo, "A"
qual seria Blah.A
. Como seria possível fazer isso?
É o Enum.valueOf()
método que eu preciso? Se sim, como eu usaria isso?
Blah.valueOf("A")
método diferencia maiúsculas de minúsculas e não tolera espaços em branco estranhos, portanto, a solução alternativa proposta abaixo por @ JoséMi.toString()
valor, não, eu não diria isso.name()
obterá o nome definido real da constante enum, a menos que você o substitua.enum Blah {...}
definição real não deve tentar declarar a sua própriavalues
nemvaluesOf
. É como você pode escrever "AnyTypeName.class" mesmo que nunca tenha declarado uma variável de membro "class"; o compilador faz tudo funcionar. (Esta resposta não pode ser útil para você 3 meses mais tarde, mas apenas no caso.)Outra solução se o texto não for igual ao valor da enumeração:
fonte
throw new IllegalArgumentException("No constant with text " + text + " found")
seria melhor quereturn null
.Aqui está um utilitário bacana que eu uso:
Então, na minha classe enum, geralmente tenho isso para salvar algumas digitações:
Se suas enumerações não são todas maiúsculas, basta alterar a
Enum.valueOf
linha.Pena que eu não posso usar
T.class
paraEnum.valueOf
comoT
é apagada.fonte
Use o padrão de Joshua Bloch, Java Efetivo :
(simplificado por questões de brevidade)
Veja também:
Exemplo de Oracle Oracle usando Enum e mapa de instâncias
Ordem de execução de blocos estáticos em um tipo Enum
Como posso procurar uma enumeração Java a partir do seu valor String
fonte
Stream.of(MyEnum.values()).collect(toMap(Enum::name, identity()))
eu também recomendo substituir toString () (transmitido pelo construtor) e usá-lo em vez de nome, especialmente se o Enum estiver associado a dados serializáveis, pois isso permite controlar a caixa sem fornecer Sonar um ajuste.unmodifiableMap
qualquer maneira, não há nenhum benefício em começar com aConcurrentHashMap
. Basta usar umHashMap
. (Se você tiver Goiaba doImmutableMap
então eu recomendo que em vez!)ConcurrentHashMap
aqui, onde o mapa nunca é modificado após a inicialização. Por isso, mesmo que, por exemplo, o exemplo no próprio JLS use um regularHashMap
.Você também deve ter cuidado com o seu caso. Deixe-me explicar: fazer
Blah.valueOf("A")
obras, masBlah.valueOf("a")
não vai funcionar. Então, novamenteBlah.valueOf("a".toUpperCase(Locale.ENGLISH))
funcionaria.editar
Alterado
toUpperCase
para comtoUpperCase(Locale.ENGLISH)
base em tc. comentar e os documentos javaedit2 No Android, você deve usar
Locale.US
, como sulai aponta .fonte
Locale.US
entradas / saídas legíveis por máquina.Aqui está um método que pode fazer isso para qualquer Enum e não diferencia maiúsculas de minúsculas.
fonte
equalsIgnoreCase
é o caminho a percorrer. +1Usar
Blah.valueOf(string)
é melhor, mas você também pode usá-loEnum.valueOf(Blah.class, string)
.fonte
No Java 8 ou posterior, usando o Streams :
fonte
Se você não quiser escrever seu próprio utilitário, use o goiaba biblioteca:
Ao contrário da função java incorporada, vamos verificar se A está presente em Blah e não gera uma exceção.
fonte
Meus 2 centavos aqui: usando Java8 Streams + verificando uma string exata:
** EDIT **
Renomeada a função para que,
fromString()
desde o nome da convenção, você obtenha alguns benefícios da própria linguagem Java; por exemplo:fonte
switch
blocos mais legíveis , é possível, em.orElse(null)
vez de.orElseThrow()
codificar a exceção - nadefault
cláusula - e incluir informações mais úteis quando necessário. E para torná-lo mais branda você poderia usarv -> Objects.equals(v.name, s == null ? "" : s.trim().toUpperCase())
Optional
partirfindFirst()
, permitindo ao usuário decidir se quer.orElse(null)
,orElseThrow()
ou o que quer ....public static MyEnum valueOf(String)
é realmente um erro de compilação, já que é o mesmo que o definido implicitamente, portanto, a versão mais antiga da sua resposta é realmente melhor. ( jls , ideone )Você pode precisar disso:
Mais uma adição:
Isso retornará o valor por um nome de enum com string. Por exemplo, se você fornecer "PERSON" no fromEnumName, ele retornará o valor de enum, ou seja, "Person"
fonte
Outra maneira de fazer isso usando o método estático implícito
name()
do Enum. name retornará a string exata usada para criar a enumeração que pode ser usada para verificar a string fornecida:Teste:
System.out.println(Blah.getEnum("B").name());
inspiration: 10 exemplos de enum em Java
fonte
valueOf
faz para você. Este método estático não oferece nada extra, exceção e tudo. Então as construções if / else são altamente perigosas ... qualquer nova constante de enum adicionada fará com que esse método seja interrompido sem alterações.name()
não é estático.Solução usando bibliotecas Guava. O método getPlanet () não faz distinção entre maiúsculas e minúsculas; portanto, getPlanet ("MerCUrY") retornará Planet.MERCURY.
fonte
Para adicionar às respostas anteriores e abordar algumas das discussões sobre nulos e NPE, estou usando Guava Optionals para lidar com casos ausentes / inválidos. Isso funciona muito bem para análise de URI / parâmetro.
Para quem não está ciente, veja mais algumas informações sobre como evitar nulo com Opcional: https://code.google.com/p/guava-libraries/wiki/UsingAndAvoidingNullExplained#Optional
fonte
No Java 8, o padrão estático do Mapa é ainda mais fácil e é o meu método preferido. Se você deseja usar o Enum com Jackson, você pode substituir ToString e usá-lo em vez de nome, e anotar com
@JsonValue
fonte
fonte
O (1) método inspirado em códigos gerados em parcelas que utilizam um mapa hash.
fonte
Enum é muito útil, tenho usado
Enum
muito para adicionar uma descrição para alguns campos em diferentes idiomas, como no exemplo a seguir:E então você pode recuperar a descrição dinamicamente com base no código do idioma passado ao
getDescription(String lang)
método, por exemplo:fonte
A respeito?
fonte
java.lang.Enum
define vários métodos úteis, que estão disponíveis para todos os tipos de enumeração em Java:name()
método para obter o nome de quaisquer constantes Enum. O literal de string usado para escrever constantes enum é o nome deles.values()
método pode ser usado para obter uma matriz de todas as constantes Enum de um tipo Enum.valueOf()
método para converter qualquer constante String para Enum em Java, como mostrado abaixo.Nesse trecho de código, o
valueOf()
método retorna uma constante Enum Gender.MALE, chamando o nome nesse retorno"MALE"
.fonte
A biblioteca commons-lang do Apache possui uma função estática org.apache.commons.lang3.EnumUtils.getEnum, que mapeará uma String para o seu tipo de Enum. A mesma resposta, essencialmente, como Geoffreys, mas por que rolar a sua própria quando já está lá fora?
fonte
Adicionando à resposta mais votada, com um utilitário útil ...
valueOf()
lança duas exceções diferentes nos casos em que não gosta de sua entrada.IllegalArgumentException
NullPointerExeption
Se seus requisitos forem tais que você não tenha garantia de que sua String definitivamente corresponderá a um valor de enum, por exemplo, se os dados da String vierem de um banco de dados e puderem conter uma versão antiga da enum, será necessário lidar com eles frequentemente...
Então, aqui está um método reutilizável que eu escrevi que permite definir um Enum padrão a ser retornado se a String que passarmos não corresponder.
Use-o assim:
fonte
Como uma
switch
versão-ainda não foi mencionada, eu a apresento (reutilizando a enumeração do OP):Como isso não dá nenhum valor adicional ao
valueOf(String name)
método, faz sentido definir um método adicional se quisermos ter um comportamento diferente. Se não queremos levantar umIllegalArgumentException
, podemos alterar a implementação para:Ao fornecer um valor padrão que manter o contrato de
Enum.valueOf(String name)
sem lançar umaIllegalArgumentException
dessa maneira que em nenhum casonull
é devolvido. Portanto, lançamos umNullPointerException
se o nome énull
e, no caso de,default
sedefaultValue
énull
. É assim quevalueOfOrDefault
funciona.Essa abordagem adota o design da
Map
interface - que fornece um método aMap.getOrDefault(Object key, V defaultValue)
partir do Java 8.fonte
Outro utilitário capturando de maneira inversa. Usando um valor que identifique esse Enum, não pelo nome.
Exemplo:
EnumUtil.from(Foo.class, "drei")
retornaFoo.THREE
, porque será usadogetValue
para corresponder ao "drei", que é um método público único, não final e não estático no Foo. No caso Foo tem mais do que na método público, não é final e não estática, por exemplo,getTranslate
que retorna "Drei", o outro método pode ser usado:EnumUtil.from(Foo.class, "drei", "getTranslate")
.fonte
Solução Kotlin
Crie um ramal e ligue
valueOf<MyEnum>("value")
. Se o tipo for inválido, você será nulo e precisará lidar com issoComo alternativa, você pode definir um valor padrão, chamando
valueOf<MyEnum>("value", MyEnum.FALLBACK)
e evitando uma resposta nula. Você pode estender sua enum específica para que o padrão seja automáticoOu, se você quiser os dois, faça o segundo:
fonte
Eu gosto de usar esse tipo de processo para analisar comandos como seqüências de caracteres em enumerações. Normalmente, eu tenho uma das enumerações como "desconhecida", portanto, isso ajuda a retornar quando as outras não são encontradas (mesmo que não sejam sensíveis a maiúsculas e minúsculas) em vez de nulas (o que significa que não há valor). Portanto, eu uso essa abordagem.
fonte
A maneira mais rápida de obter o nome de enum é criar um mapa de texto e valor de enum quando o aplicativo é iniciado e, para obter o nome, chame a função Blah.getEnumName ():
fonte