Eu gostaria de procurar uma enumeração a partir do seu valor de string (ou possivelmente qualquer outro valor). Eu tentei o código a seguir, mas ele não permite estática nos inicializadores. Existe uma maneira simples?
public enum Verbosity {
BRIEF, NORMAL, FULL;
private static Map<String, Verbosity> stringMap = new HashMap<String, Verbosity>();
private Verbosity() {
stringMap.put(this.toString(), this);
}
public static Verbosity getVerbosity(String key) {
return stringMap.get(key);
}
};
stringMap
inicialização). A solução usual é usar uma classe aninhada.Respostas:
Use o
valueOf
método criado automaticamente para cada Enum.Para valores arbitrários, comece com:
Avance apenas mais tarde para a implementação do Mapa se o seu profiler solicitar.
Eu sei que ele está iterando sobre todos os valores, mas com apenas 3 valores enum dificilmente vale a pena qualquer outro esforço, na verdade, a menos que você tenha muitos valores, eu não me incomodaria com um mapa, será rápido o suficiente.
fonte
IllegalArgumentException
vez de retornar nulo ( ou seja, quando nenhuma correspondência for encontrada) - é assim que o JDKEnum.valueOf(..)
faz isso de qualquer maneira.Você está perto. Para valores arbitrários, tente algo como o seguinte:
fonte
HashMap<>
para armazenar as enumeras. mais de 40% mais rápido que um loop de pisocom o Java 8, você pode conseguir desta maneira:
fonte
null
. Mas é também dependendo do caso de uso@ A resposta de Lyle é bastante perigosa e vi que não funcionará particularmente se você fizer do enum uma classe interna estática. Em vez disso, usei algo assim, que carregará os mapas BootstrapSingleton antes das enumerações.
Editar isso não deve mais ser um problema com as JVMs modernas (JVM 1.6 ou superior), mas acho que ainda existem problemas com o JRebel, mas não tive a chance de testá-lo novamente .
Carregue-me primeiro:
Agora carregue-o no construtor enum:
Se você tem uma enumeração interna, basta definir o Mapa acima da definição de enumeração e que (em teoria) deve ser carregado antes.
fonte
E você não pode usar valueOf () ?
Edit: Btw, não há nada impedindo você de usar static {} em uma enumeração.
fonte
valueOf
na classe enum, para que você não precise especificar a classe enumClass
.Caso ajude outras pessoas, a opção que eu prefiro, que não está listada aqui, usa a funcionalidade Mapas do Guava :
Com o padrão que você pode usar
null
, você podethrow IllegalArgumentException
oufromString
pode retornar umOptional
, qualquer que seja o comportamento de sua preferência.fonte
desde o java 8 você pode inicializar o mapa em uma única linha e sem bloco estático
fonte
Function.identity()
antes, acho muito mais textualmente atraente do quee -> e
.Talvez, dê uma olhada nisso. Está funcionando para mim. O objetivo disso é pesquisar 'RED' com '/ red_color'. Declarar ae
static map
carregar osenum
s somente uma vez traria alguns benefícios de desempenho se osenum
s fossem muitos.Por favor, coloque suas opiniões.
fonte
Você pode definir seu Enum como o seguinte código:
Veja o link a seguir para mais esclarecimentos
fonte
Se você deseja um valor padrão e não deseja criar mapas de pesquisa, pode criar um método estático para lidar com isso. Este exemplo também lida com pesquisas onde o nome esperado começaria com um número.
Se você precisar dele com um valor secundário, basta criar o mapa de pesquisa primeiro, como em algumas das outras respostas.
fonte
}
fonte
Você pode usar a
Enum::valueOf()
função conforme sugerido por Gareth Davis e Brad Mace acima, mas lembre-se de lidar com oIllegalArgumentException
que seria lançado se a string usada não estiver presente na enumeração.fonte