O que é Enum em Kotlin?

Um enum class em Kotlin define um conjunto fixo de constantes. Cada constante é uma instância única da classe enum, representando um valor possível dentro de um grupo fechado. É ideal pra representar opções predefinidas como dias da semana, estados, categorias, etc.

Sintaxe básica

enum class Cor {
    VERMELHO, VERDE, AZUL, AMARELO
}

fun main() {
    val minhaCor = Cor.VERDE
    println(minhaCor)        // VERDE
    println(minhaCor.name)   // VERDE
    println(minhaCor.ordinal) // 1
}

Cada constante tem name (o nome como String) e ordinal (a posição, começando do zero).

Enum com propriedades

enum class Estado(val sigla: String, val regiao: String) {
    SAO_PAULO("SP", "Sudeste"),
    RIO_DE_JANEIRO("RJ", "Sudeste"),
    BAHIA("BA", "Nordeste"),
    PARANA("PR", "Sul")
}

fun main() {
    val estado = Estado.BAHIA
    println("${estado.name}: ${estado.sigla} - ${estado.regiao}")
    // BAHIA: BA - Nordeste
}

Enum com métodos

enum class Operacao {
    SOMA {
        override fun calcular(a: Double, b: Double) = a + b
    },
    SUBTRACAO {
        override fun calcular(a: Double, b: Double) = a - b
    },
    MULTIPLICACAO {
        override fun calcular(a: Double, b: Double) = a * b
    };

    abstract fun calcular(a: Double, b: Double): Double
}

fun main() {
    println(Operacao.SOMA.calcular(10.0, 3.0))          // 13.0
    println(Operacao.MULTIPLICACAO.calcular(10.0, 3.0))  // 30.0
}

Usando com when

Enum combina perfeitamente com when:

enum class StatusPedido { PENDENTE, PROCESSANDO, ENVIADO, ENTREGUE }

fun mensagem(status: StatusPedido): String = when (status) {
    StatusPedido.PENDENTE -> "Aguardando confirmação"
    StatusPedido.PROCESSANDO -> "Preparando seu pedido"
    StatusPedido.ENVIADO -> "Pedido a caminho!"
    StatusPedido.ENTREGUE -> "Pedido entregue com sucesso"
}

Funções utilitárias

// Listar todos os valores
Cor.entries.forEach { println(it) }

// Converter de String
val cor = Cor.valueOf("AZUL")
println(cor) // AZUL

Enums são simples, seguros e expressivos. Use sempre que tiver um conjunto fixo de opções no seu domínio.