Hoje falaremos sobre como trabalhar com enumerações de strings e, mais especificamente, com
enum
classes que organizam a interação com constantes de strings.
Usando enumerações de string
Durante o desenvolvimento do aplicativo, você precisa operar periodicamente em um conjunto fixo de valores de string. Poderia ser qualquer coisa. Por exemplo, uma lista de códigos de cores suportados pela aplicação, ou uma lista de dispositivos com os quais a nossa aplicação pode interagir, estações, etc. Tudo isso é um conjunto predefinido de constantes de string com uma estrutura comum, com a qual é necessário estabelecer a interação do programa no nível do código Java. Quando você precisa interagir com um conjunto predefinido de constantes de string (e outras), a melhor solução é escrever sua própriaenum
classe. Abaixo veremos exemplos de conversão enum
para string
.
Criando Enumerações de String
Vamos criarenum
uma classe que armazene uma lista de diferentes ambientes para implantação da aplicação, bem como a URL de cada ambiente:
public enum Environment {
PROD("https://release.application.com/"),
TEST("https://test.application.com/"),
AUTO_TEST("https://autotest.application.com/"),
DEV("http://localhost:8080");
private final String url;
Environment(String url) {
this.url = url;
}
public String getUrl() {
return url;
}
}
Nesta classe definimos 4 ambientes:
PROD
- liberarTEST
- para testes manuaisAUTO_TEST
— ambiente para autotestesDEV
— local para desenvolvimento e depuração
- Cada URL é uma constante de string em nossa enumeração: elas são definidas entre parênteses ao lado de cada
enum
constante. - Deve haver um construtor que receba um argumento do mesmo tipo de cada
enum
constante. - O escopo do construtor
private
épackage private
. - É necessário definir uma variável - um campo de classe que armazenará as constantes de string que definimos. Você deve criar um método getter para este campo para usar os valores das constantes de string externamente.
Iterando sobre enumerações de string
Neste estágio, já podemos iterar sobre todosenum
os valores disponíveis, bem como obter constantes de string associadas a eles. Para obter todos os valores de qualquer enum
classe, você precisa usar o método values()
:
public class Main {
public static void main(String[] args) {
for (Environment env : Environment.values()) {
System.out.println(env + " : " + env.getUrl());
}
}
}
Conclusão:
PROD : https://release.application.com/
TEST : https://test.application.com/
AUTO_TEST : https://autotest.application.com/
DEV : http://localhost:8080
Como pode ser visto no exemplo, para imprimir o nome da enum
constante, passamos para o método System.out.println
, e para imprimir a url associada a esta constante, usamos o getter que definimos.
Obtendo uma constante de string de enum
Para obter o valor de qualquer constante de string, também podemos chamar um getter em qualquerenum
constante:
public class Main {
public static void main(String[] args) {
String prodUrl = Environment.PROD.getUrl();
String devUrl = Environment.DEV.getUrl();
System.out.println("Production url is: " + prodUrl);
System.out.println("Development url is: " + devUrl);
}
}
Conclusão:
Production url is: https://release.application.com/
Development url is: http://localhost:8080
Obtendo constante enum por nome
Às vezes é necessário obterenum
uma constante pelo nome da string. Isso é feito usando o método valueOf(String)
, que retorna uma constante pelo seu nome:
public class Main {
public static void main(String[] args) {
Environment prod = Environment.valueOf("PROD");
Environment dev = Environment.valueOf("DEV");
System.out.println("Production url is: " + prod.getUrl());
System.out.println("Development url is: " + dev.getUrl());
}
}
Conclusão:
Production url is: https://release.application.com/
Development url is: http://localhost:8080
Mas aqui é preciso cautela. Se o método não encontrar enum
uma constante com o nome especificado, uma exceção será lançada java.lang.IllegalArgumentException
.
Convertendo String em Enum
Às vezes surge a necessidade oposta. Conhecendo o valorenum
, obtenha enum
a própria constante. Aqueles. em nosso exemplo, conhecendo um determinado endereço, você precisa obter a Environment
constante correspondente. Existem várias opções para fazer isso. E todos eles exigem aprimoramento na enum
própria aula. Opção 1. Enumeração dentro da classe. Você precisa criar um método que aceite uma string e compare-a com todos os valores enum
da classe. Se houver correspondência, o método retornará a enumeração desejada. Para nosso exemplo, precisamos Environment
criar o seguinte método dentro da classe:
public static Environment getEnvByUrl(String url) {
for (Environment env : values()) {
// либо equalsIgnoreCase, на ваше усмотрение
if (env.getUrl().equals(url)) {
return env;
}
}
// Либо просто вернуть null
throw new IllegalArgumentException("No enum found with url: [" + url + "]");
}
Então podemos obter enum
da string assim:
public class Main {
public static void main(String[] args) {
String url = "http://localhost:8080";
Environment env = Environment.getEnvByUrl(url);
System.out.println("Environment name for url=[" + url + "] is: " + env);
}
}
Conclusão:
Environment name for url=[http://localhost:8080] is: DEV
Essa abordagem tem suas desvantagens. Cada vez, para obter enum
uma constante, você terá que percorrer todos os valores e fazer um certo número de comparações. A penalidade de desempenho neste caso será determinada pelo número de constantes e pelo número de operações semelhantes. O segundo método para resolver este problema não apresenta esse problema. Código completo Enum
da classe:
public enum Environment {
PROD("https://release.application.com/"),
TEST("https://test.application.com/"),
AUTO_TEST("https://autotest.application.com/"),
DEV("http://localhost:8080");
private final String url;
Environment(String url) {
this.url = url;
}
public String getUrl() {
return url;
}
public static Environment getEnvByUrl(String url) {
for (Environment env : values()) {
if (env.getUrl().equals(url)) {
return env;
}
}
throw new IllegalArgumentException("No enum found with url: [" + url + "]");
}
}
Opção 2: Uso HashMap
Neste caso, criamos um mapa dentro do nosso enum e o preenchemos uma vez em tempo de compilação, e então retiramos os valores dele:
public enum Environment {
PROD("https://release.application.com/"),
TEST("https://test.application.com/"),
AUTO_TEST("https://autotest.application.com/"),
DEV("http://localhost:8080");
private final String url;
Environment(String url) {
this.url = url;
}
public String getUrl() {
return url;
}
// Создаем static final карту
private static final Map<String, Environment> LOOKUP_MAP = new HashMap<>();
// Заполняем её всеми значениями
static {
for (Environment env : values()) {
LOOKUP_MAP.put(env.getUrl(), env);
}
}
// Возвращаем Environment по строковому url
public static Environment getEnvByUrl(String url) {
return LOOKUP_MAP.get(url);
}
}
Em termos de uso, ambas as opções são idênticas:
public class Main {
public static void main(String[] args) {
String url = "http://localhost:8080";
Environment env = Environment.getEnvByUrl(url);
System.out.println("Environment name for url=[" + url + "] is: " + env);
}
}
Conclusão:
Environment name for url=[http://localhost:8080] is: DEV
Mas este método também tem desvantagens. Em primeiro lugar, há muito mais código. E em segundo lugar, HashMap
todos enum
os valores serão armazenados permanentemente na memória do aplicativo. Como você pode ver, tudo tem prós e contras. Mas considerando que enum
as classes geralmente não armazenam tantos valores, as desvantagens serão quase imperceptíveis. Há uma ressalva: se tal operação (obter um valor Java Enum por String) for realizada com frequência, é melhor usar a segunda opção. Você pode aprender mais sobre este tópico e Enum
aulas em geral no curso JavaRush. Os alunos aprendem JavaRush Enum
já na primeira aula do quinto nível .
GO TO FULL VERSION