Sobes.tech
Middle

Jakie są cechy pracy z klasami Enum w Kotlin?

sobes.tech AI

Odpowiedź od AI

Klasa enum to specjalny typ klasy używany do reprezentowania zbioru stałych.

Cechy:

  • Definicja stałych: Każda stała wyliczenia jest instancją klasy wyliczeniowej.
    enum class Color {
        RED, GREEN, BLUE
    }
    
  • Właściwości i metody: Klasy enum mogą mieć właściwości i metody. Każda stała może je implementować na różne sposoby.
    enum class Status(val description: String) {
        SUCCESS("Operacja zakończona sukcesem"),
        ERROR("Wystąpił błąd"),
        PENDING("Oczekuje")
    }
    
    enum class Direction {
        NORTH, SOUTH, EAST, WEST;
    
        fun getOpposite(): Direction {
            return when (this) {
                NORTH -> SOUTH
                SOUTH -> NORTH
                EAST -> WEST
                WEST -> EAST
            }
        }
    }
    
  • Klasy anonimowe: Każda stała wyliczenia może być zadeklarowana z klasą anonimową, która zapewnia własne implementacje metod lub właściwości.
    enum class State {
        IDLE {
            override fun signal() = READY
        },
        READY {
            override fun signal() = IDLE
        }; // Kropka i średnik są obowiązkowe przed deklaracją członków klasy
    
        abstract fun signal(): State
    }
    
  • Implementacja interfejsów: Klasa enum może implementować interfejsy.
    interface Printable {
        fun printName()
    }
    
    enum class Shape : Printable {
        CIRCLE {
            override fun printName() {
                println("Koło")
            }
        },
        SQUARE {
            override fun printName() {
                println("Kwadrat")
            }
        }
    }
    
  • Wbudowane właściwości: Każda stała ma wbudowane właściwości name (nazwa stałej jako łańcuch) i ordinal (pozycja stałej w deklaracji, zaczynając od 0).
    enum class Priority {
        LOW, MEDIUM, HIGH
    }
    
    fun main() {
        println(Priority.MEDIUM.name)    // Wyjście: MEDIUM
        println(Priority.HIGH.ordinal) // Wyjście: 2
    }
    
  • Wbudowane funkcje:
    • enumValues<T>(): Zwraca tablicę wszystkich stałych w klasie enum.
    • enumValueOf<T>(name: String): Zwraca stałą klasy enum o podanej nazwie. Rzuca IllegalArgumentException, jeśli stała nie zostanie znaleziona.
    fun main() {
        val allPriorities = enumValues<Priority>()
        println(allPriorities.joinToString()) // Wyjście: LOW, MEDIUM, HIGH
    
        val highPriority = enumValueOf<Priority>("HIGH")
        println(highPriority) // Wyjście: HIGH
    }
    
  • Użycie w wyrażeniach when: Idealne do użycia w when. Kompilator ostrzeże, jeśli nie wszystkie gałęzie są obsłużone (przy użyciu jako wyrażenie z wartością zwracaną).
    fun processStatus(status: Status) {
        when (status) {
            Status.SUCCESS -> println("Sukces")
            Status.ERROR -> println("Błąd")
            Status.PENDING -> println("Oczekiwanie")
        }
    }
    

Enumy w Kotlin są bardziej potężne w porównaniu do ich odpowiedników w Javie, pozwalając na dodawanie właściwości, metod i implementację interfejsów.