Clase de enumeración o enum class en Kotlin
Además de data class (Clase de datos o data class en Kotlin), otro tipo especial de clase en Kotlin es la enum class, que se utiliza para definir un conjunto de constantes y se declara anteponiendo la palabra enum:
enum class Direccion {NORTE, SUR, ESTE, OESTE}
Otro ejemplo de enum class:
enum class DiaSemana {LUNES, MARTES, MIERCOLES, JUEVES, VIERNES, SABADO, DOMINGO} fun main() { val diaSemana = DiaSemana.LUNES println(diaSemana) // LUNES }
Dado que cada elemento es una instancia de la clase enum, también se pueden inicializar haciendo referencia a una propiedad definida en el constructor:
enum class Color(val rgb: Int) { ROJO(0xFF0000), VERDE(0x00FF00), AZUL(0x0000FF) }
Aplicando esto al ejemplo anterior:
enum class DiaSemana (val dia: Int) { LUNES(1), MARTES (2), MIERCOLES (3), JUEVES(4), VIERNES(5), SABADO(6), DOMINGO(7) } fun main() { val diaSemana = DiaSemana.JUEVES println(diaSemana) // JUEVES println(diaSemana.name) // JUEVES println(diaSemana.dia) // 4 // obtenemos la posición de la constante dentro de la enum class println(diaSemana.ordinal) // 3 }
En el siguiente ejemplo creamos un juego de cartas que reparte 5 cartas utilizando una enum class para definir el conjunto de palos de la baraja:
// declaramos enum class enum class PaloNaipe {DIAMANTES, TREBOLES, CORAZONES, PICAS} // clase con una propiedad tipo enum class PaloNaipe y otra tipo Int class Carta(private val palo: PaloNaipe, private val valor: Int) { fun mostrar() { println("$valor de $palo") } } fun main() { // obtenemos el valor de la carta fun getValor() = (1..13).random() // obtenemos el palo de la carta // enumerando las constantes definidas en la clase enum // EnumClass.values(): Array<EnumClass> fun getPalo() = PaloNaipe.values().random() // repartimos y mostramos 5 cartas for (i in 1..5) { Carta(getPalo(), getValor()).mostrar() } }
5 de DIAMANTES 10 de PICAS 1 de DIAMANTES 4 de CORAZONES 1 de PICAS
Como hemos visto y al igual que las clases comunes, una clase enum puede tener propiedades definidas en el constructor:
enum class Operacion(val tipo: String) { SUMA("+"), RESTA("-"), MULTIPLICACION("*"), DIVISION("/") } class Calculo(private val valor1: Int, private val valor2: Int, private val operacion: Operacion) { fun calcular() { val resultado = when (operacion) { Operacion.SUMA -> valor1 + valor2 Operacion.RESTA -> valor1 - valor2 Operacion.MULTIPLICACION -> valor1 * valor2 Operacion.DIVISION -> valor1 / valor2 } println("$valor1 ${operacion.tipo} $valor2 = $resultado") } } fun main() { val calculo1 = Calculo(20, 6, Operacion.SUMA) calculo1.calcular() // 20 + 6 = 26 val calculo2 = Calculo(24, 4, Operacion.DIVISION) calculo2.calcular() // 24 / 4 = 6 }
También podemos recorrer los elementos de una enum class y obtener una referencia de cada constante con valueOf:
enum class DiaSemana (val dia: Int) { LUNES(1), MARTES (2), MIERCOLES (3), JUEVES(4), VIERNES(5), SABADO(6), DOMINGO(7) } fun main() { for(dia in DiaSemana.values()) { val diaSemana = DiaSemana.valueOf(dia.toString()) println("${diaSemana.dia} $diaSemana") } }
1 LUNES 2 MARTES 3 MIERCOLES 4 JUEVES 5 VIERNES 6 SABADO 7 DOMINGO
Comentarios
Publicar un comentario