JavaRush /Blogue Java /Random-PT /Convertendo Enum em String

Convertendo Enum em String

Publicado no grupo Random-PT
Hoje falaremos sobre como trabalhar com enumerações de strings e, mais especificamente, com enumclasses que organizam a interação com constantes de strings. Convertendo Enum em String - 1

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ópria enumclasse. Abaixo veremos exemplos de conversão enumpara string.

Criando Enumerações de String

Vamos criar enumuma 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- liberar
  • TEST- para testes manuais
  • AUTO_TEST— ambiente para autotestes
  • DEV— local para desenvolvimento e depuração
E também 4 URLs para cada um desses ambientes. Vamos prestar atenção em alguns pontos importantes.
  1. Cada URL é uma constante de string em nossa enumeração: elas são definidas entre parênteses ao lado de cada enumconstante.
  2. Deve haver um construtor que receba um argumento do mesmo tipo de cada enumconstante.
  3. O escopo do construtor privateé package private.
  4. É 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 todos enumos valores disponíveis, bem como obter constantes de string associadas a eles. Para obter todos os valores de qualquer enumclasse, 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 enumconstante, 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 qualquer enumconstante:
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 obter enumuma 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 enumuma 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 valor enum, obtenha enuma própria constante. Aqueles. em nosso exemplo, conhecendo um determinado endereço, você precisa obter a Environmentconstante correspondente. Existem várias opções para fazer isso. E todos eles exigem aprimoramento na enumpró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 enumda classe. Se houver correspondência, o método retornará a enumeração desejada. Para nosso exemplo, precisamos Environmentcriar 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 enumda 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 enumuma 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 Enumda 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, HashMaptodos enumos valores serão armazenados permanentemente na memória do aplicativo. Como você pode ver, tudo tem prós e contras. Mas considerando que enumas 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 Enumaulas em geral no curso JavaRush. Os alunos aprendem JavaRush Enumjá na primeira aula do quinto nível . Convertendo Enum em String - 2
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION