Comparación de enum en Java: ¿== o equals()? Detalles que no se cuentan

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: El error que quizás estás cometiendo ahora mismo

\n\n

Imagina la situación: estás programando en Java, usas enumeraciones (enum) y necesitas comparar dos valores. Automáticamente escribes if (day == Day.MONDAY). O quizás, if (day.equals(Day.MONDAY)). ¿Y cuál es la opción correcta? ¿Acaso hay alguna diferencia?

\n\n

Esta pregunta es una de las más populares en Stack Overflow. Miles de desarrolladores (desde principiantes hasta seniors) se la han hecho. Parece un detalle menor. Pero detrás de este "detalle" se esconde una comprensión profunda de cómo funciona la JVM, cómo están construidos los enum y por qué en Java no todo es tan sencillo.

\n\n

En este artículo, de una vez por todas, aclararemos: cómo comparar correctamente enum en Java, cuándo usar == y cuándo equals(), y por qué una de estas opciones es casi siempre la mejor elección.

\n\n

Respuesta corta para los impacientes

\n\n

Si necesitas la respuesta ahora mismo — usa ==.

\n\n

¡Pero! Antes de que cierres el artículo, analicemos por qué es así y qué trampas te pueden esperar. Porque el diablo, como siempre, está en los detalles.

\n\n

¿Por qué enum no es solo un conjunto de constantes?

\n\n

Para entender la diferencia entre == y equals(), debemos recordar qué es realmente un enum en Java.

\n\n

Cada enum es una clase completa que hereda implícitamente de java.lang.Enum. Cada constante de enum es una instancia final estática de esta clase. La JVM garantiza que para cada valor de enum existe exactamente un objeto en memoria.

\n\n

Mira este código:

\n\n
public enum Day {\n    MONDAY,\n    TUESDAY,\n    WEDNESDAY,\n    THURSDAY,\n    FRIDAY,\n    SATURDAY,\n    SUNDAY\n}
\n\n

Cuando la JVM carga este enum, crea exactamente 7 objetos. Day.MONDAY es siempre el mismo objeto. Siempre. Y este es el punto clave.

\n\n

Comparación con ==: ¿Por qué funciona?

\n\n

El operador == en Java compara referencias a objetos. No mira el contenido — verifica si dos variables apuntan al mismo objeto en memoria.

\n\n

Dado que la JVM garantiza la unicidad de cada instancia de enum, la comparación con == para enum funciona perfectamente:

\n\n
public class EnumComparison {\n    public static void main(String[] args) {\n        Day today = Day.WEDNESDAY;\n        Day anotherDay = Day.WEDNESDAY;\n        \n        // Ambas variables referencian el mismo objeto en memoria\n        System.out.println(today == anotherDay); // true\n        \n        // Comparación con otra constante\n        System.out.println(today == Day.MONDAY); // false\n    }\n}
\n\n

Salida:

\n
true\nfalse
\n\n

Todo es simple y elegante. Pero veamos qué sucede bajo el capó.

\n\n

¿Por qué es seguro? Garantías de la JVM

\n\n

La Especificación del Lenguaje Java (JLS 8.9) garantiza que cada valor de enum se inicializa exactamente una vez al cargar la clase. No podrás crear un duplicado mediante reflexión, serialización o clonación. Incluso si intentas usar new, el compilador dará un error.

\n\n

Por lo tanto, == para enum no es solo que "funciona", es la forma más rápida y confiable de comparación.

\n\n

Comparación con equals(): Funciona, pero tiene matices

\n\n

El método equals() también funciona. La clase Enum sobrescribe equals() y, internamente, usa ==:

\n\n
// Código real de java.lang.Enum\npublic final boolean equals(Object other) {\n    return this == other;\n}
\n\n

Es decir, llamar a day.equals(Day.MONDAY) termina haciendo lo mismo que day == Day.MONDAY. Pero hay una diferencia importante:

\n\n

El problema con null

\n\n

Si tu variable puede ser

Blogs

Book Recommendations