Sobes.tech
Middle

Czy znasz klasy sealed i na czym polega ich specyfika?

sobes.tech AI

Odpowiedź od AI

Tak, znam.

Cecha klas sealed polega na tym, że pozwalają ograniczyć hierarchię dziedziczenia. Wszystkie bezpośrednie podtypy klasy sealed muszą być zadeklarowane w tym samym pliku. To gwarantuje, że kompilator zna wszystkie możliwe podtypy, co jest przydatne do sprawdzania wyczerpującości w wyrażeniach when.

Przykład:

sealed class Result {
    data class Success(val message: String) : Result()
    data class Error(val code: Int, val description: String) : Result()
    object Loading : Result() // Singleton dla stanu ładowania
}

fun processResult(result: Result) {
    when (result) {
        is Result.Success -> println("Sukces: ${result.message}")
        is Result.Error -> println("Błąd ${result.code}: ${result.description}")
        Result.Loading -> println("Ładowanie...")
        // Nie jest potrzebny else, ponieważ kompilator zna wszystkie opcje
    }
}

Zalety:

  • Bezpieczeństwo: Gwarantuje wyczerpującość wyrażeń when bez konieczności używania else.
  • Czytelność: Wyraźnie wskazuje ograniczony zestaw możliwych stanów lub podtypów.
  • Kontrola: Zapobiega niekontrolowanemu dziedziczeniu z zewnątrz.

Różnica od enum class: Klasy sealed mogą mieć różne typy danych dla każdego podtypu (np. Success i Error w przykładzie), podczas gdy elementy enum class są statyczne i mogą mieć tylko określone właściwości, wspólne dla wszystkich. Klasy sealed mogą także mieć instancje-obiektu (Loading).