Sobes.tech
Junior — Middle

Czym różni się użycie sealed class od enum w odniesieniu do ich konstruktorów i możliwości ich tworzenia?

sobes.tech AI

Odpowiedź od AI

Enum w Kotlin (i Java) reprezentuje zbiór stałych. Każdy enum ma ograniczony zestaw instancji, zdefiniowanych w samej deklaracji. Konstruktory enum są zawsze prywatne, i nie można tworzyć nowych instancji — tylko tych, które są zadeklarowane.

Sealed class (klasa zamknięta) to abstrakcyjna klasa z ograniczonym zestawem podklas, które są deklarowane w tym samym pliku. W przeciwieństwie do enum, klasa zamknięta pozwala na tworzenie różnych typów z różną strukturą i stanem. Konstruktory klasy zamkniętej mogą być otwarte lub zamknięte, i można tworzyć nowe instancje podklas, a nie tylko stałe konstansy.

Przykład:

// Enum z prywatnym konstruktorem i stałymi instancjami
enum class Direction(val degrees: Int) {
    NORTH(0), EAST(90), SOUTH(180), WEST(270)
}

// Klasa zamknięta z różnymi podklasami i konstruktorami
sealed class Result {
    data class Success(val data: String) : Result()
    data class Error(val error: Throwable) : Result()
}

val res: Result = Result.Success("OK")

W ten sposób enum jest ograniczony do zestawu stałych instancji z prywatnym konstruktorem, a klasa zamknięta — jest bardziej elastyczna, pozwalając na tworzenie różnych podklas z własnymi konstruktorami i stanami.