23.1 Enumy

enum class používame pre hodnoty, ktorých možný počet je pevne daný. Namiesto voľného textu, napríklad "PONDELOK", tak môžeme použiť bezpečný typ Den, ktorý si sami vytvoríme.

enum class Den {
    PONDELOK,
    UTOROK,
    STREDA,
    STVRTOK,
    PIATOK,
    SOBOTA,
    NEDELA
}

fun main() {
    val dnes = Den.PIATOK
    println(dnes) // PIATOK
}

Enumy sa dobre kombinujú s podmienkou when. Keď spracujeme všetky hodnoty enumu, nepotrebujeme písať vetvu else.

enum class StavObjednavky {
    NOVA,
    ZAPLATENA,
    ODOSLANA,
    DORUCENA
}

fun vypisStav(stav: StavObjednavky) = when (stav) {
    StavObjednavky.NOVA -> "Objednávka čaká na platbu"
    StavObjednavky.ZAPLATENA -> "Objednávka je zaplatená"
    StavObjednavky.ODOSLANA -> "Objednávka je na ceste"
    StavObjednavky.DORUCENA -> "Objednávka bola doručená"
}

fun main() {
    println(vypisStav(StavObjednavky.ODOSLANA))
}

Atribúty a metódy enumu

Každá hodnota enumu môže mať vlastné údaje. V nasledujúcom príklade má nápoj uloženú cenu:

enum class Napoj(val cena: Double) {
    VODA(1.20),
    DZUS(2.50),
    KAVA(1.80)
}

fun main() {
    val napoj = Napoj.KAVA
    println("${napoj.name}: ${napoj.cena} EUR")
}

Všetky hodnoty enumu získame funkciou entries:

enum class Farba {
    CERVENA,
    MODRA,
    ZELENA
}

fun main() {
    for (farba in Farba.entries) {
        println(farba)
    }
}

Názov konkrétnej hodnoty získame cez name. Číselné poradie hodnoty začínajúce od nuly získame cez ordinal, ale na logiku programu je lepšie vytvoriť vlastný atribút.

Úlohy

Úloha 1

Vytvor enum DenVTyzdni so všetkými dňami. Pomocou when vypíš Pracovný deň alebo Víkend.

Úloha 2

Vytvor enum Priorita s hodnotami NIZKA, STREDNA a VYSOKA. Každej hodnote priraď číselnú váhu a vypíš ju pre zvolenú prioritu.

Úloha 3

Vytvor enum VelkostTrička s hodnotami S, M, L a XL. Vypíš všetky dostupné veľkosti pomocou VelkostTrička.entries.