Hoy hablaremos sobre cómo trabajar con enumeraciones de cadenas y, más específicamente, con
enum
clases que organizan la interacción con constantes de cadenas.
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 propiaenum
clase. A continuación veremos ejemplos de conversión enum
a string
.
Crear enumeraciones de cadenas
Creemosenum
una 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
- liberarTEST
— para pruebas manualesAUTO_TEST
— entorno para pruebas automáticasDEV
— local para desarrollo y depuración
- Cada URL es una cadena constante en nuestra enumeración: se definen entre paréntesis al lado de cada
enum
constante. - Debe haber un constructor que tome un argumento del mismo tipo que cada
enum
constante. - El alcance del constructor
private
espackage private
. - 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 todosenum
los valores disponibles, así como obtener constantes de cadena asociadas con ellos. Para obtener todos los valores de cualquier enum
clase, 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 enum
la 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 cualquierenum
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);
}
}
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 obtenerenum
una 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 enum
una 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 valorenum
, obtenga enum
la constante misma. Aquellos. En nuestro ejemplo, al conocer una determinada dirección, es necesario obtener la Environment
constante correspondiente. Hay varias opciones para hacer esto. Y todos ellos requieren una mejora en enum
la 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 enum
de la clase. Si hay una coincidencia, el método devolverá la enumeración deseada. Para nuestro ejemplo, necesitamos Environment
crear 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 enum
de 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 enum
una 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, HashMap
todos enum
los 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 enum
las 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 Enum
las clases en general en el curso JavaRush. Los estudiantes aprenden JavaRush Enum
ya en la primera lección del quinto nivel .
GO TO FULL VERSION