Sobes.tech
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 è private di default.
  • La classe sealed non 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 when con 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
Ereditarietà No Sì, ma limitata allo stesso file/modulo