Interfețe Sigilate (Sealed Interfaces) și Evaluare Exhaustivă cu when în Kotlin în Kotlin

Clase și obiecte Kotlin 2.0

Ghid complet pentru Sealed Interfaces în Kotlin: modelarea stărilor de UI în arhitecturi MVI/MVVM, suport pentru moștenire multiplă și evaluare exhaustivă garantată la compilare în expresii when.

Sintaxă
sealed interface UIState { data object Loading : UIState; data class Success(...) : UIState }

Modelarea stărilor de interfață utilizator (UI States) și a evenimentelor de domeniu necesită ierarhii închise de tipuri algebrice (Sum Types / Tagged Unions). În timp ce sealed class limita moștenirea la o singură clasă părinte, introducerea sealed interface deblochează flexibilitatea compoziției multiple:

O interfață marcată cu sealed impune ca toate implementările sale să fie declarate în același modul sau pachet, oferind compilatorului K2 certitudinea matematică a listei exhaustive de variante.

Modelarea Stării de UI cu Sealed Interfaces și Data Objects
// Definirea stării ecranului în arhitecturi Android / KMP:
sealed interface StareEcran {
    // 'data object' oferă automat implementare curată de toString/equals pentru stări singleton:
    data object Incarcare : StareEcran
    data class Succes(val date: List) : StareEcran
    data class Eroare(val mesaj: String, val cod: Int) : StareEcran
}

// Consumul exhaustiv în corpul unei expresii when:
fun randeazaInterfata(stare: StareEcran): String {
    // Nu este nevoie de clauza 'else'! 
    // Dacă adăugați o nouă variantă în StareEcran, compilatorul va refuza să compileze
    // până nu tratați noul caz în toate blocurile 'when' din aplicație!
    return when (stare) {
        is StareEcran.Incarcare -> "Se afișează indicatorul circular de încărcare..."
        is StareEcran.Succes -> "Afișare ${stare.date.size} elemente din listă."
        is StareEcran.Eroare -> "Eroare [${stare.cod}]: ${stare.mesaj}"
    }
}

fun main() {
    val stareCurenta: StareEcran = StareEcran.Succes(listOf("Articol 1", "Articol 2"))
    println(randeazaInterfata(stareCurenta))
}

Sealed Class vs. Sealed Interface

Caracteristică sealed class sealed interface
Moștenire Moștenire simplă unică (o clasă poate extinde un singur părinte). Moștenire multiplă (o clasă poate implementa mai multe interfețe sigilate).
Constructori Poate reține constructori și stare comună de câmpuri protejate. Nu poate conține stare internă de instanță (doar proprietăți abstracte).
Suport Enum Un enum class nu poate extinde o clasă. Un enum class poate implementa o interfață sigilată!