Middle
Come usare le classi sealed per modellare gerarchie in Kotlin?
sobes.tech AI
Risposta dell'AI
Le classi sealed (sealed classes) vengono utilizzate per rappresentare gerarchie di ereditarietà limitate, dove tutti i sottotipi possibili sono noti al momento della compilazione.
Caratteristiche principali:
- Tutti i sottotipi diretti devono trovarsi nello stesso file della classe sealed (prima di Kotlin 1.5). A partire da Kotlin 1.5, possono essere in qualsiasi file della stessa compilazione.
- I sottotipi di una classe sealed possono essere classi normali, data class, dichiarazioni object o altre classi sealed.
- Il costruttore della classe sealed è privato per impostazione predefinita; altri modificatori (public, protected, internal) non sono consentiti.
- Permettono di usare un'analisi esaustiva (
exhaustive) nelle espressioni when, garantendo la gestione di tutte le opzioni possibili e eliminando la necessità di un ramo else.
Esempio di utilizzo per modellare lo stato di un'interfaccia utente:
sealed class UiState {
object Loading : UiState() // Stato di caricamento
data class Success(val data: String) : UiState() // Dati caricati con successo
data class Error(val message: String) : UiState() // Errore
}
Utilizzo in un'espressione when:
fun handleUiState(state: UiState): String {
return when (state) {
UiState.Loading -> "Caricamento dati..."
is UiState.Success -> "Dati caricati con successo: ${state.data}"
is UiState.Error -> "Errore: ${state.message}"
}
}
Vantaggi:
- Sicurezza del tipo: il compilatore verifica che tutti i sottotipi possibili siano gestiti.
- Leggibilità: mostra chiaramente quali varianti di dati o stati possono esistere.
- Comodità: semplifica il lavoro con le espressioni
when.