Cómo obtener un enum a partir de una cadena en Java: guía completa para principiantes

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Introducción: ¿Por qué enum y cadena son compañeros eternos?

\n\n

Imagine: está escribiendo un programa que recibe comandos del usuario. El usuario ingresa "RED", y su programa debe entender que es el color Color.RED. O está leyendo datos de una base de datos, donde el estado se almacena como texto "ACTIVE", y en el código tiene un enum Status.ACTIVE. ¿Cómo relacionar una cadena y un enum? Esta es una de las preguntas más populares en Stack Overflow entre los desarrolladores Java principiantes — y hoy la resolveremos de una vez por todas.

\n\n

En este artículo aprenderá:

\n
    \n
  • Cómo obtener un enum a partir de una cadena en Java usando valueOf()
  • \n
  • Cómo manejar la situación cuando la cadena no está en el enum (para que el programa no falle)
  • \n
  • Cómo escribir su propio método para una conversión flexible
  • \n
  • Cómo trabajar con mayúsculas/minúsculas y espacios
  • \n
\n

¡Vamos allá!

\n\n

1. ¿Qué es un enum y por qué convertirlo a cadena?

\n\n

Enum (abreviatura de enumeration — enumeración) es un tipo de datos especial en Java que contiene un conjunto fijo de constantes. Por ejemplo, días de la semana, colores, estados de pedidos.

\n\n
public enum Color {\n    RED, GREEN, BLUE, YELLOW\n}
\n\n

Trabajar con enum es cómodo: el código se vuelve legible y el compilador verifica que no use un valor inexistente. Pero a menudo los datos provienen del mundo exterior — de un archivo, base de datos o entrada del usuario — en forma de cadenas. Y aquí surge la tarea: ¿cómo obtener un enum a partir de una cadena en Java?

\n\n

2. Método básico: el método valueOf()

\n\n

La forma más simple e incorporada es usar el método estático valueOf(), que tiene cada enum. Toma una cadena y devuelve la constante enum correspondiente. Importante: las cadenas deben coincidir exactamente con los nombres de las constantes en cuanto a mayúsculas/minúsculas.

\n\n
public class Main {\n    public static void main(String[] args) {\n        String input = "RED";\n        Color color = Color.valueOf(input);\n        System.out.println("Color: " + color); // Salida: Color: RED\n    }\n}\n\nenum Color {\n    RED, GREEN, BLUE\n}
\n\n

¿Funciona? Sí. Pero hay un truco. Si pasa la cadena "red" (en minúsculas) o "PURPLE" (que no está en el enum), Java lanzará una excepción IllegalArgumentException. Y eso significa que el programa fallará. No es bueno.

\n\n

3. Cómo evitar errores: manejo de excepciones

\n\n

Para que el programa no se bloquee, es necesario capturar la excepción. Esto es especialmente importante cuando obtiene un enum a partir de una cadena ingresada por el usuario.

\n\n
public static Color getColorFromString(String input) {\n    try {\n        return Color.valueOf(input.toUpperCase());\n    } catch (IllegalArgumentException e) {\n        System.out.println("Error: ¡el color '" + input + "' no existe!");\n        return null; // o un valor por defecto\n    }\n}\n\npublic static void main(String[] args) {\n    String userInput = "blue";\n    Color color = getColorFromString(userInput);\n    if (color != null) {\n        System.out.println("Ha seleccionado: " + color);\n    }\n}
\n\n

Observe: usamos input.toUpperCase() — esto permite aceptar cadenas en cualquier mayúscula/minúscula. En Java, los nombres de enum se escriben normalmente en mayúsculas, por lo que este truco casi siempre funciona.

\n\n

4. Método avanzado: método propio con Map

\n\n

A veces los nombres de las constantes en el enum no coinciden con lo que viene del exterior. Por ejemplo, tiene un enum con nombres en español o con espacios. En tales casos, es necesario crear su propio mapeo (mapping).

\n\n
import java.util.HashMap;\nimport java.util.Map;\n\npublic enum Status {\n    ACTIVE("activo"),\n    INACTIVE("inactivo"),\n    PENDING("pendiente");\n\n    private final String displayName;\n\n    Status(String displayName) {\n        this.displayName = displayName;\n    }\n                

Blogs

Book Recommendations