Sobes.tech
Middle

Ești familiarizat cu clasele sealed și care este caracteristica lor?

sobes.tech AI

Răspuns de la AI

Da, cunosc.

Caracteristica claselor sealed este că permit limitarea ierarhiei de moștenire. Toți subtipurile directe ale unei clase sealed trebuie declarate în același fișier. Acest lucru asigură că compilatorul cunoaște toate subtipurile posibile, ceea ce este util pentru verificarea exhaustivității în expresiile when.

Exemplu:

sealed class Result {
    data class Success(val message: String) : Result()
    data class Error(val code: Int, val description: String) : Result()
    object Loading : Result() // Singleton pentru starea de încărcare
}

fun processResult(result: Result) {
    when (result) {
        is Result.Success -> println("Succes: ${result.message}")
        is Result.Error -> println("Eroare ${result.code}: ${result.description}")
        Result.Loading -> println("Se încarcă...")
        // Nu este nevoie de else, deoarece compilatorul cunoaște toate variantele
    }
}

Avantaje:

  • Siguranță: Asigură exhaustivitatea expresiilor when fără nevoie de else.
  • Claritate: Indică clar un set limitat de stări sau subtipuri posibile.
  • Control: Previne moștenirea necontrolată din exterior.

Diferența față de enum class: Clasele sealed pot avea tipuri de date diferite pentru fiecare subtip (cum ar fi Success și Error în exemplu), în timp ce elementele enum class sunt statice și pot avea doar anumite proprietăți, comune pentru toți. Clasele sealed pot avea, de asemenea, instanțe-objet (Loading).