Sobes.tech
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.