sealed class și interface în Kotlin — ce este, sintaxă și aplicare

Autor: IT Sectr Publicat: 2026-06-20 Timp de citire: 11 min

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 — ierarhie limitată, unde toate subclasele sunt cunoscute în faza de compilare
  • when — procesarea exhaustivă a tuturor subclaselor fără bloc else obligatoriu
  • sealed interface — adăugat în Kotlin 1.5 pentru ierarhii flexibile fără restricții de moștenire
  • Compilare — eroare de compilare la when incomplet pentru tipurile sealed
  • Ierarhie — toate subclasele trebuie să fie în același fișier sau în interiorul clasei sealed

Ce sunt sealed class și sealed interface?

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.

Sintaxa sealed class

Declararea sealed class începe cu modificatorul sealed înainte de class. Subclasele sunt declarate în același fișier.

kotlin
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 class imbricate

sealed clasele pot fi imbricate, creând ierarhii pe mai multe niveluri pentru modele de date complexe fără pierderea siguranței tipurilor.

kotlin
sealed class UiState {
    object Idle : UiState()
    object Loading : UiState()
    data class Content(val items: List<Item>) : UiState()
    data class Error(val exception: Throwable) : UiState()
}

Sintaxa sealed interface (Kotlin 1.5+)

sealed interface se declară similar cu sealed class, dar permite implementarea mai multor interfețe sealed într-o singură clasă.

kotlin
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.

Când să alegem sealed interface în loc de sealed class

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.

Procesarea exhaustivă în when

Principalul avantaj al tipurilor sealed este procesarea exhaustivă în expresia when. Compilatorul verifică că toate subclasele posibile sunt luate în considerare.

kotlin
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.

Comparația sealed class cu enum class

enum class și sealed class sunt adesea confundate, dar au scopuri și capacități diferite.

Caracteristicăsealed classenum class
InstanțeMultiple (data class), una (object)Exact una per constantă
ProprietățiDiferite pentru fiecare subclasăIdentice pentru toate constantele
MoștenireDa (de la sealed class)Nu (implicit final)
ConstructorPoate avea parametriDoar comun pentru toate constantele
IerarhieLimitată, sealedSet 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.

Scenarii practice de aplicare

Tipurile sealed sunt utilizate în proiectele Kotlin pentru o serie de scenarii standard care necesită modelare cu siguranța tipurilor.

Starea UI în Jetpack Compose

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.

Rezultatul solicitărilor de rețea

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.

Navigarea în proiecte multi-modul

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

Unde trebuie declarate subclasele sealed class?

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.

Poate sealed interface să aibă implementări în alt 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.

Care este diferența dintre sealed class și 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.

Cum ajută clasele sealed în expresiile when?

Compilatorul verifică completitudinea when: dacă nu toate subclasele sunt procesate, codul nu se compilează. Aceasta elimină erorile runtime și face codul mai sigur.

Se poate crea un sealed class cu constructor?

Da, sealed class poate avea constructor (implicit private). Toate subclasele pot transmite parametri acestui constructor prin super().

Concluzii

  • sealed class — ierarhie limitată cu subclase cunoscute în faza de compilare
  • sealed interface — alternativă flexibilă (Kotlin 1.5+) cu suport pentru implementare multiplă
  • when — procesare exhaustivă cu verificare de către compilator, else nu este necesar
  • Un fișier — toate subclasele și implementările trebuie să fie într-un singur fișier cu tipul sealed
  • Modelare — stări UI, rezultate de rețea, navigare, sisteme de evenimente
  • Siguranță — adăugarea unei noi subclase fără procesare în when cauzează eroare de compilare
  • Alegere — sealed interface preferat implicit, sealed class când este necesară stare comună

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.

Discutați proiectul

Citiți și