ProgramaciónDesarrollador Senior de Java

¿Cómo funcionan los enums en Java, qué matices están relacionados con su uso y por qué un enum no es solo un conjunto simple de constantes?

Supere entrevistas con el asistente de IA Hintsage

Respuesta

En Java, enum es un tipo de clase, heredero de java.lang.Enum, que representa un conjunto limitado de objetos constantes, pero no se limita solo a un conjunto de nombres: un enum se puede extender con métodos, campos, constructores, implementar interfaces y agregar comportamiento.

Ejemplo:

enum Day { MONDAY("Día de trabajo"), SATURDAY("Día de descanso"); private String description; Day(String description) { this.description = description; } public String getDescription() { return description; } } Day d = Day.SATURDAY; System.out.println(d.getDescription()); // "Día de descanso"

Matices:

  • Enum garantiza la unicidad de las constantes: instancias singleton.
  • Se pueden implementar interfaces.
  • Cada valor tiene su propia clase (se pueden sobrescribir métodos por valor).
  • Enum está protegido contra clonación y creación de nuevas instancias a través de reflection.

Pregunta capciosa

Pregunta: "¿Se pueden sobrescribir métodos para algunos valores de enum? Si es así, ¿cómo?"

Error común: se equivoca al suponer que todos los valores tienen un comportamiento siempre igual.

Respuesta correcta: Sí, son posibles implementaciones específicas para constantes individuales.

Ejemplo:

enum Operation { PLUS { double apply(double x, double y) { return x + y; } }, MINUS { double apply(double x, double y) { return x - y; } }; abstract double apply(double x, double y); }

Ejemplos de errores reales debido a la falta de conocimiento de los matices del tema


Historia

En el sistema de contabilidad de automovilistas, se almacenaban estados como enums, no se implementó un campo adicional para el código API — los desarrolladores intentaron extender el enum a través de la herencia, lo cual está prohibido. Al final, tuvieron que rehacer el modelo de almacenamiento de estados.


Historia

En una tienda online, los programadores "desempaquetaron" un enum con un constructor privado utilizando una herramienta de reflection para crear una instancia falsa para pruebas, pero obtuvieron una excepción: enum está protegido contra la creación de nuevas instancias. La CI falló, las pruebas no pasaron.


Historia

En un proyecto antiguo, los valores del enum se comparaban usando equals(), en lugar de usar ==. Inesperadamente, surgieron problemas durante la deserialización: los valores de enum siempre se comparan usando ==, ya que son singletons.