Clase de enumeración o enum class en Kotlin

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

Entradas populares

I/O: entrada y salida de datos en consola

Recursos gratis para aprender Kotlin

Lectura y escritura de archivos