JavaRush /Blog Java /Random-ES /Convertir enumeración en cadena

Convertir enumeración en cadena

Publicado en el grupo Random-ES
Hoy hablaremos sobre cómo trabajar con enumeraciones de cadenas y, más específicamente, con enumclases que organizan la interacción con constantes de cadenas. Conversión de enumeración a cadena - 1

Usar enumeraciones de cadenas

Durante el desarrollo de la aplicación, es necesario operar periódicamente con un conjunto fijo de valores de cadena. Podría ser cualquier cosa. Por ejemplo, una lista de códigos de colores soportados por la aplicación, o una lista de dispositivos con los que nuestra aplicación puede interactuar, estaciones, etc. Todo esto es un conjunto predefinido de constantes de cadena con una estructura común, con el cual es necesario establecer la interacción del programa a nivel de código Java. Cuando necesita interactuar con un conjunto predefinido de cadenas (y otras) constantes, la mejor solución es escribir su propia enumclase. A continuación veremos ejemplos de conversión enuma string.

Crear enumeraciones de cadenas

Creemos enumuna clase que almacene una lista de diferentes entornos para implementar la aplicación, así como la URL de cada entorno:
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;
    }
}
En esta clase hemos definido 4 entornos:
  • PROD- liberar
  • TEST— para pruebas manuales
  • AUTO_TEST— entorno para pruebas automáticas
  • DEV— local para desarrollo y depuración
Y también 4 URL para cada uno de estos entornos. Prestemos atención a algunos puntos importantes.
  1. Cada URL es una cadena constante en nuestra enumeración: se definen entre paréntesis al lado de cada enumconstante.
  2. Debe haber un constructor que tome un argumento del mismo tipo que cada enumconstante.
  3. El alcance del constructor privatees package private.
  4. Es necesario definir una variable, un campo de clase que almacenará las constantes de cadena que hemos definido. Debe crear un método getter para este campo para poder utilizar los valores de las constantes de cadena externamente.

Iterando sobre enumeraciones de cadenas

En esta etapa, ya podemos iterar sobre todos enumlos valores disponibles, así como obtener constantes de cadena asociadas con ellos. Para obtener todos los valores de cualquier enumclase, es necesario utilizar el método values():
public class Main {
    public static void main(String[] args) {
        for (Environment env : Environment.values()) {
            System.out.println(env + " : " + env.getUrl());
        }
    }
}
Conclusión:

PROD : https://release.application.com/
TEST : https://test.application.com/
AUTO_TEST : https://autotest.application.com/
DEV : http://localhost:8080
Como se puede ver en el ejemplo, para imprimir el nombre de enumla constante, lo pasamos al método System.out.println, y para imprimir la URL asociada con esta constante, usamos el getter que definimos.

Obtener una cadena constante de enum

Para obtener el valor de cualquier constante de cadena, también podemos llamar a un captador en cualquier 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);

    }
}
Conclusión:

Production url is: https://release.application.com/
Development url is: http://localhost:8080

Obteniendo la constante de enumeración por nombre

A veces es necesario obtener enumuna constante por su nombre de cadena. Esto se hace usando el método valueOf(String), que devuelve una constante por su nombre:
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());

    }
}
Conclusión:

Production url is: https://release.application.com/
Development url is: http://localhost:8080
Pero aquí se necesita precaución. Si el método no encuentra enumuna constante con el nombre especificado, se generará una excepción java.lang.IllegalArgumentException.

Conversión de cadena a enumeración

A veces surge la necesidad contraria. Conociendo el valor enum, obtenga enumla constante misma. Aquellos. En nuestro ejemplo, al conocer una determinada dirección, es necesario obtener la Environmentconstante correspondiente. Hay varias opciones para hacer esto. Y todos ellos requieren una mejora en enumla propia clase. Opción 1. Enumeración dentro de la clase. Debe crear un método que acepte una cadena y la compare con todos los valores enumde la clase. Si hay una coincidencia, el método devolverá la enumeración deseada. Para nuestro ejemplo, necesitamos Environmentcrear el siguiente método dentro de la clase:
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 + "]");
}
Entonces podemos obtener enumde la cadena así:
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);
    }
}
Conclusión:

Environment name for url=[http://localhost:8080] is: DEV
Este enfoque tiene sus desventajas. Cada vez, para obtener enumuna constante, tendrás que recorrer todos los valores y realizar un cierto número de comparaciones. La penalización de rendimiento en este caso estará determinada por el número de constantes y el número de operaciones similares. El segundo método para resolver este problema no tiene este problema. Código de clase completo Enum:
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 + "]");
    }
}
Opción 2: uso HashMap En este caso, creamos un mapa dentro de nuestra enumeración y lo completamos una vez en el momento de la compilación, y luego tomamos los valores de él:
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);
    }
}
En cuanto al uso, ambas opciones son 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);
    }
}
Conclusión:

Environment name for url=[http://localhost:8080] is: DEV
Pero este método también tiene desventajas. En primer lugar, hay mucho más código. Y en segundo lugar, HashMaptodos enumlos valores se almacenarán en la memoria de la aplicación de forma permanente. Como puedes ver, todo tiene pros y contras. Pero teniendo en cuenta que enumlas clases no suelen almacenar tantos valores, las desventajas serán casi invisibles. Hay una advertencia: si dicha operación (obtener un valor de enumeración Java por cadena) se realiza con frecuencia, es mejor utilizar la segunda opción. Puedes aprender más sobre este tema y Enumlas clases en general en el curso JavaRush. Los estudiantes aprenden JavaRush Enumya en la primera lección del quinto nivel . Conversión de enumeración a cadena - 2
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION