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ń
whenbez konieczności używaniaelse. - 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).