ProgramaciónDesarrollador de Kotlin

Describe el mecanismo de las clases enum en Kotlin: qué es una clase enum, en qué se diferencia de Java, cuáles son las características y limitaciones de enum, cómo agregar funcionalidad personalizada, qué matices pueden surgir en la serialización y comparación. Proporcione un ejemplo.

Supere entrevistas con el asistente de IA Hintsage

Respuesta.

En Kotlin, las enumeraciones (enum class) permiten declarar un conjunto de valores limitados y, al mismo tiempo, extenderlos con métodos y propiedades.

Puntos principales:

  • La clase enum se declara de manera similar a Java, pero la sintaxis es más estricta:
    enum class Direction { NORTH, SOUTH, WEST, EAST }
  • Los elementos de enum son singletons, instancias del subtipo correspondiente de la clase.
  • Se pueden definir propiedades y métodos adicionales dentro del enum:
    enum class Color(val rgb: Int) { RED(0xFF0000), GREEN(0x00FF00), BLUE(0x0000FF); fun containsRed() = (rgb and 0xFF0000 != 0) }
  • Se puede acceder a cada valor por nombre (Color.RED.name), índice (ordinal) y obtener la lista completa a través de values().
  • En Kotlin no se pueden heredar clases enum, pero se pueden implementar interfaces.
  • La diferencia con Java: no se pueden heredar clases de enum explícitamente, no se puede usar una lista anidada;
  • Enum en Kotlin no se serializa por defecto con las herramientas estándar (por ejemplo, Gson o Jackson) — se requieren adaptadores/anotaciones especiales.

Comparación de enums:

  • Los enums se comparan mediante == (identidad), ya que los elementos son únicos.
  • Al serializar, los nombres pueden cambiar, es mejor definir explícitamente los valores (patrón de valor de almacenamiento).

Pregunta capciosa.

¿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 }

Ejemplos de errores reales debido al desconocimiento de las sutilezas del tema.


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.