Sobes.tech
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 when senza bisogno di else.
  • 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).