En Kotlin, las enumeraciones (enum class) permiten declarar un conjunto de valores limitados y, al mismo tiempo, extenderlos con métodos y propiedades.
enum class Direction { NORTH, SOUTH, WEST, EAST }
enum son singletons, instancias del subtipo correspondiente de la clase.enum class Color(val rgb: Int) { RED(0xFF0000), GREEN(0x00FF00), BLUE(0x0000FF); fun containsRed() = (rgb and 0xFF0000 != 0) }
Color.RED.name), índice (ordinal) y obtener la lista completa a través de values().== (identidad), ya que los elementos son únicos.¿Se puede definir un método abstracto dentro de una clase enum en Kotlin, al igual que en Java, para que cada elemento lo sobrescriba?
Respuesta correcta: Sí, se puede declarar un método abstracto en estilo enum, ¡y cada elemento debe proporcionar su implementación!
enum class State { START { override fun next() = RUNNING }, RUNNING { override fun next() = STOPPED }, STOPPED { override fun next() = STOPPED }; abstract fun next(): State }
Historia
Al migrar de Java a Kotlin, el equipo intentó heredar un nuevo class enum como una clase normal — se descubrió que los enums no se pueden heredar, rompiendo la arquitectura. Tuvo que cambiar completamente el enfoque hacia la modularidad de las máquinas de estado.
Historia
Para almacenar un valor en la base de datos, tomaron el nombre del elemento (
enum.name), pero con el refactorizado, el enum renombró los elementos — los datos de la base dejaron de corresponder con la nueva lógica, hubo una pérdida de consistencia (el patrón de valor de almacenamiento no se implementó).
Historia
Para la serialización de la clase enum a través de Gson, olvidaron conectar el TypeAdapter personalizado. En producción, el servicio comenzó a devolver valores JSON incorrectos, porque el analizador estándar serializaba el campo incorrecto (ordinal o name), y la deserialización no coincidía entre microservicios.