Middle
Ce sunt clasele 'sealed' în Kotlin și în ce cazuri trebuie utilizate?
sobes.tech AI
Răspuns de la AI
Clasa sealed este utilizată pentru a reprezenta o ierarhie limitată de clase. Toți subtipurile directe ale unei clase sealed trebuie să fie definite în același fișier cu clasa sealed sau în aceleași module (pentru Kotlin 1.5+). Acest lucru permite compilatorului să verifice dacă toate subtipurile posibile sunt tratate într-o expresie when, făcând-o exhaustivă fără a fi nevoie de o ramură else.
Caracteristici cheie:
- Toate subclasele directe trebuie să fie locale.
- Constructorul clasei
sealedesteprivateimplicit. - Clasa
sealednu poate fi abstractă. - Nu permite crearea de instanțe.
Cazuri de utilizare:
- Reprezentarea unui set limitat de stări sau rezultate. De exemplu,
Loading,Success(data),Error(message).sealed class Result<out T> { data class Success<T>(val data: T) : Result<T>() data class Error(val message: String) : Result<Nothing>() object Loading : Result<Nothing>() } - Tratarea variantelor într-o expresie
whencu garanție de exhaustivitate.fun processResult(result: Result<String>) { when (result) { is Result.Success -> println("Date primite: ${result.data}") is Result.Error -> println("Eroare: ${result.message}") Result.Loading -> println("Se încarcă...") } // Nu este nevoie de o ramură `else`, deoarece compilatorul cunoaște toate subtipurile. } - Utilizare ca echivalent al enumerărilor cu posibilitatea de a încapsula date în fiecare variantă.
Comparație cu clasele enum:
| Caracteristică | enum class |
sealed class |
|---|---|---|
| Instanțe | Set limitat de constante denumite | Set limitat de tipuri |
| Date în variante | Nu (doar proprietăți) | Da (prin subclase) |
| Membri abstracti | Nu | Da |
| Moștenire | Nu | Da, dar limitată la același fișier/modul |