Middle
Cosa sono le classi 'sealed' in Kotlin e in quali casi devono essere utilizzate?
sobes.tech AI
Risposta dell'AI
La classe sealed viene utilizzata per rappresentare una gerarchia limitata di classi. Tutti i sottotipi diretti di una classe sealed devono essere definiti nello stesso file della classe sealed o negli stessi moduli (per Kotlin 1.5+). Questo permette al compilatore di verificare che tutti i sottotipi possibili siano gestiti in un'espressione when, rendendola esaustiva senza bisogno di un ramo else.
Caratteristiche principali:
- Tutti i sottoclassi diretti devono essere locali.
- Il costruttore della classe
sealedèprivatedi default. - La classe
sealednon può essere astratta. - Non permette di creare istanze.
Casi d'uso:
- Rappresentazione di un insieme limitato di stati o risultati. Ad esempio,
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>() } - Gestione delle varianti in un'espressione
whencon garanzia di completezza.fun processResult(result: Result<String>) { when (result) { is Result.Success -> println("Dati ricevuti: ${result.data}") is Result.Error -> println("Errore: ${result.message}") Result.Loading -> println("Caricamento...") } // Non è necessario un ramo `else`, poiché il compilatore conosce tutti i sottotipi. } - Utilizzo come equivalente di enumerazioni con la possibilità di incapsulare dati in ogni variante.
Confronto con le classi enum:
| Caratteristica | enum class |
sealed class |
|---|---|---|
| Esempi | Limite di costanti denominate | Limite di tipi |
| Dati nelle varianti | No (solo proprietà) | Sì (tramite sottoclassi) |
| Membri astratti | No | Sì |
| Ereditarietà | No | Sì, ma limitata allo stesso file/modulo |