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:
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); }
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.