sealed class și sealed interface în Kotlin sunt mecanisme de ierarhie limitată a tipurilor, unde toate subclasele posibile sunt cunoscute în faza de compilare. Spre deosebire de clasele abstracte obișnuite, sealed class garantează procesarea exhaustivă a tuturor variantelor în expresia when. Conform documentației JetBrains Kotlin Language Guide (2026), tipurile sealed stau la baza modelării stărilor, ecranelor UI și tipurilor de rezultat în proiectele Kotlin.
Principalele
sealed class este o clasă abstractă cu restricția: toate subclasele sale directe trebuie declarate în același fișier ca și clasa sealed. Această restricție face ierarhia închisă (sealed) — niciun cod din afara fișierului nu poate adăuga o nouă subclasă.
sealed interface, adăugat în Kotlin 1.5, oferă aceeași garanție, dar cu flexibilitatea unui interfață: sealed interface poate fi implementat de mai multe clase, obiecte sau alte interfețe într-un singur fișier. Spre deosebire de sealed class, sealed interface nu are restricția de moștenire unică — o clasă poate implementa mai multe interfețe sealed simultan.
Conform Kotlin Evolution and Roadmap (2026), sealed interface a fost adăugat la cererea comunității pentru o modelare mai flexibilă. Motivația principală a fost posibilitatea de a combina ierarhii independente de tipuri fără moștenire multiplă a claselor.
Declararea sealed class începe cu modificatorul sealed înainte de class. Subclasele sunt declarate în același fișier.
sealed class NetworkResult {
data class Success(val data: String) : NetworkResult()
data class Error(val message: String) : NetworkResult()
object Loading : NetworkResult()
}
Fiecare subclasă a sealed class poate avea propriile proprietăți și metode. Loading este un singleton (object), Success și Error sunt data class cu parametri. Compilatorul cunoaște toate cele trei variante și verifică completitudinea lor la utilizarea în when.
sealed clasele pot fi imbricate, creând ierarhii pe mai multe niveluri pentru modele de date complexe fără pierderea siguranței tipurilor.
sealed class UiState {
object Idle : UiState()
object Loading : UiState()
data class Content(val items: List<Item>) : UiState()
data class Error(val exception: Throwable) : UiState()
}
sealed interface se declară similar cu sealed class, dar permite implementarea mai multor interfețe sealed într-o singură clasă.
sealed interface Action
sealed interface Loggable
data class Navigate(val route: String) : Action, Loggable
data class ShowToast(val text: String) : Action
object GoBack : Action, Loggable
Clasa Navigate implementează simultan două interfețe sealed — Action și Loggable. Pentru sealed class acest lucru este imposibil din cauza restricției de moștenire unică. sealed interface oferă flexibilitatea combinării ierarhiilor independente.
sealed interface este preferat când ierarhia nu necesită stare comună sau constructor. Conform JetBrains Kotlin Guidelines (2026), sealed interface ar trebui utilizat implicit pentru toate ierarhiile noi unde nu este necesar un constructor comun, făcând codul mai flexibil pentru extensii viitoare.
Principalul avantaj al tipurilor sealed este procesarea exhaustivă în expresia when. Compilatorul verifică că toate subclasele posibile sunt luate în considerare.
fun handleResult(result: NetworkResult): String = when (result) {
is NetworkResult.Success -> "Data: ${result.data}"
is NetworkResult.Error -> "Error: ${result.message}"
is NetworkResult.Loading -> "Loading..."
// else nu este necesar — compilatorul știe că toate variantele sunt acoperite
}
Dacă dezvoltatorul adaugă o nouă subclasă în ierarhia sealed, dar uită să o proceseze în when — compilatorul va da o eroare. Aceasta este siguranță la nivel de tipuri, indisponibilă când se utilizează ierarhii deschise cu ramura else.
Conform Google Android Developers (2026), clasele sealed sunt metoda recomandată pentru modelarea stării UI în Jetpack Compose. Verificarea exhaustivă when previne situațiile în care dezvoltatorul nu a procesat toate variantele posibile de afișare a ecranului.
enum class și sealed class sunt adesea confundate, dar au scopuri și capacități diferite.
| Caracteristică | sealed class | enum class |
|---|---|---|
| Instanțe | Multiple (data class), una (object) | Exact una per constantă |
| Proprietăți | Diferite pentru fiecare subclasă | Identice pentru toate constantele |
| Moștenire | Da (de la sealed class) | Nu (implicit final) |
| Constructor | Poate avea parametri | Doar comun pentru toate constantele |
| Ierarhie | Limitată, sealed | Set fix de constante |
Alegerea între sealed class și enum class depinde de sarcină. Dacă variantele nu poartă date suplimentare — utilizați enum. Dacă fiecare variantă conține câmpuri unice — utilizați sealed class sau sealed interface.
Tipurile sealed sunt utilizate în proiectele Kotlin pentru o serie de scenarii standard care necesită modelare cu siguranța tipurilor.
Fiecare ecran Compose poate avea o sealed class UiState care descrie toate stările posibile: Idle, Loading, Content(data), Error(exception). Expresia when garantează că toate stările sunt procesate.
NetworkResult cu variantele Success, Error, Loading — un model standard în proiectele Kotlin cu Retrofit și Ktor. sealed class asigură procesarea sigură a fiecărui rezultat al solicitării.
sealed interface pentru rutele de navigare permite modulelor să își declare propriile rute, rămânând în cadrul unei ierarhii unice. Aceasta elimină erorile cu rute necunoscute în faza de compilare.
Conform KotlinConf (2025), sealed class și sealed interface stau la baza designului type-safe în aplicațiile moderne Kotlin. Ele se combină cu data class pentru modelarea structurilor de domeniu complexe fără pierderea siguranței în faza de compilare.
Întrebări frecvente
Toate subclasele directe ale sealed class trebuie declarate în același fișier. Pentru sealed interface aceeași regulă — implementările într-un singur fișier.
Nu, regula unui singur fișier se aplică și pentru sealed interface. Toate implementările trebuie să se afle în fișierul unde este declarat sealed interface.
sealed interface nu are stare și constructor, permite implementare multiplă. sealed class poate avea constructor și stare comună, dar o clasă poate moșteni doar un singur sealed class.
Compilatorul verifică completitudinea when: dacă nu toate subclasele sunt procesate, codul nu se compilează. Aceasta elimină erorile runtime și face codul mai sigur.
Da, sealed class poate avea constructor (implicit private). Toate subclasele pot transmite parametri acestui constructor prin super().
Concluzii
Vom dezvolta o aplicație mobilă la cheie
IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.
Citiți și