Middle
Conosci le classi sealed e qual è la loro caratteristica?
sobes.tech AI
Risposta dell'AI
Sì, conosco.
La caratteristica delle classi sealed è che consentono di limitare la gerarchia di ereditarietà. Tutti i sottotipi diretti di una classe sealed devono essere dichiarati nello stesso file. Questo garantisce che il compilatore conosca tutti i possibili sottotipi, il che è utile per verificare la completezza nelle espressioni when.
Esempio:
sealed class Result {
data class Success(val message: String) : Result()
data class Error(val code: Int, val description: String) : Result()
object Loading : Result() // Singleton per lo stato di caricamento
}
fun processResult(result: Result) {
when (result) {
is Result.Success -> println("Successo: ${result.message}")
is Result.Error -> println("Errore ${result.code}: ${result.description}")
Result.Loading -> println("Caricamento...")
// Non è necessario un else, poiché il compilatore conosce tutte le opzioni
}
}
Vantaggi:
- Sicurezza: Garantisce l'esauribilità delle espressioni
whensenza bisogno dielse. - Leggibilità: Indica chiaramente un insieme limitato di stati o sottotipi possibili.
- Controllo: Previene l'ereditarietà non controllata dall'esterno.
Differenza con enum class: Le classi sealed possono avere tipi di dati diversi per ogni sottotipo (come Success e Error nell'esempio), mentre gli elementi di enum class sono statici e possono avere solo proprietà definite, comuni a tutti. Le classi sealed possono anche avere istanze-oggetto (Loading).