Los enums o enumeraciones en Kotlin facilitan la organización clara y sencilla de grupos limitados de constantes relacionadas. Estas herramientas resultan prácticas cuando necesitas representar un conjunto fijo y limitado de valores, como carpetas de correo electrónico, prioridades o estados concretos.
¿Qué son los enums y cuándo utilizarlos en Kotlin?
En Kotlin, un enum es un tipo especial de clase que contiene un número fijo de constantes relacionadas. Para declararlos, empleamos la combinación de palabras clave enum class. Un ejemplo de aplicación común sería categorizar las carpetas de una bandeja de email:
Los enums proporcionan un nivel adicional de control y claridad, siendo especialmente útiles al combinarlos con estructuras como when.
¿Cómo utilizar enums con estructuras de control como el when?
Al usar una variable de tipo enum con la estructura when, Kotlin verifica automáticamente que contemples todos los posibles casos, evitando así errores u omisiones:
when(carpetaActual){ EmailFolders.INBOX ->println("Bienvenido a bandeja de entrada") EmailFolders.SENT ->println("Bienvenido a enviados") EmailFolders.DRAFT ->println("Bienvenido a borradores") EmailFolders.ARCHIVE ->println("Bienvenido a archivados") EmailFolders.SPAM ->println("Bienvenido a spam")}
Esto asegura que cada opción disponible sea tratada adecuadamente, mejorando considerablemente la consistencia del entorno de trabajo.
¿Cómo asignar propiedades adicionales a cada constante en un enum?
Los enums no sólo guardan simples constantes, también permiten asignarles propiedades únicas, como niveles de prioridad o colores específicos:
Esta capacidad permite mayor flexibilidad y una mejor integración visual o lógica dentro de tu aplicación.
¿Cómo transformar entradas de usuario usando enums?
Cuando el usuario introduce un valor, es posible convertirlo directamente en una enumeración mediante una función dedicada.
funprioridadAPriority(entero: Int): EmailPriority?{returnif(entero in0 until EmailPriority.entries.size) EmailPriority.entries[entero]elsenull}
Verificar que la entrada del usuario cae dentro del rango permitido evita errores inesperados en tiempo de ejecución.
¿Cómo iterar sobre los valores de un enum?
Para recorrer y utilizar todos los valores de un enum, Kotlin proporciona la función entries y métodos como forEachIndexed, útiles para mostrar índices y propiedades:
EmailPriority.entries.forEachIndexed{ index, priority ->println("$index: ${priority.name}, nivel ${priority.level}, color ${priority.color}")}
Esto resulta especialmente valioso al construir interfaces amigables al usuario, mostrando claramente opciones disponibles.
Ejercicio práctico con enums
Se propone crear un enum llamado EstadoEmail con las constantes NUEVO, LEIDO y RESPONDIDO. Además, asignarles íconos representativos (en formato String o Int). Finalmente, implementar una función para convertir una entrada numérica a uno de estos estados, mostrando claramente su índice e icono asociado.
Te invitamos a compartir dudas o resultados en los comentarios. ¡Sigue practicando y fortaleciendo tus habilidades con Kotlin!
enumclassEstadoEmail(val icono:Int){NUEVO(1),LEIDO(2),RESPONDIDO(3)}fun conversorEstadoEmail(index:Int):EstadoEmail?{returnif(index in0 until EstadoEmail.entries.size){EstadoEmail.entries.get(index)// o tambien se puede hacer//EstadoEmail.entries[index]}elsenull}EstadoEmail.entries.forEachIndexed{ index, estado ->println("[$index] $estado ${estado.icono}")}// O tambien se puede usarEstadoEmail.entries.forEach{ estadoEmail ->println(" $estadoEmail[${estadoEmail.icono}]")}// o tambien con forfor(estadoEmails inEstadoEmail.entries){println("{$estadoEmails} -> ${estadoEmails.icono}")}
Una duda, no es lo mismo usar
println(prioridadEmail.?name)
que
println(prioridadEmail)
? En consola ambos me imprimieron lo mismo, LOW
No es lo mismo, porque cada uno hace cosas diferentes.
- El primero esta accede al atributo name y ten cuidado, porqué el signo ? debe ir antes que el punto.
- El segundo va acceder en la dirección en memoria si fuera una clase, pero como es un Enum y ya accediste a una posición dentro de el. Este de devolverá el nombre de la constante que definiste en esa posición.
Posición 0 esta LOW. Además, ten en cuenta que esa variable toma el retorno de la función prioridadIntEmailPriority
Hola, no es exactamente lo mismo. En la primera forma (println(prioridadEmail?.name)) se imprime explícitamente la propiedad name del enum, que corresponde al nombre declarado del enum (por ejemplo LOW)
En la segunda (println(prioridadEmail)), Kotlin llama internamente a toString(). En los enums, por defectotoString()retornaname, por eso en consola ambos imprimen LOW
La diferencia aparece si se sobrescribe toString() en el enum, ya que en ese caso println(prioridadEmail) puede mostrar una representación personalizada, mientras que name siempre seguirá devolviendo el nombre original del enum