Študijné materiály

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.