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ă! |