sealed class és interface Kotlinban — mi ez, szintaxis és alkalmazás

Szerző: IT Sectr Megjelenés: 2026-06-20 Olvasási idő: 11 perc

sealed class és sealed interface Kotlinban a típusok korlátozott hierarchiájának mechanizmusai, ahol az összes lehetséges alosztály ismert a fordítási szakaszban. A szokásos absztrakt osztályokkal ellentétben a sealed class garantálja az összes változat kimerítő feldolgozását a when kifejezésben. A JetBrains Kotlin Language Guide (2026) dokumentációja szerint a sealed típusok képezik az alapot az állapotok, UI-képernyők és eredménytípusok modellezéséhez Kotlin-projektekben.

Főbb pontok

  • sealed — korlátozott hierarchia, ahol az összes alosztály ismert fordítási időben
  • when — az összes alosztály kimerítő feldolgozása kötelező else blokk nélkül
  • sealed interface — Kotlin 1.5-ben hozzáadva rugalmas hierarchiákhoz öröklési korlátozások nélkül
  • Fordítás — fordítási hiba hiányos when esetén sealed típusoknál
  • Hierarchia — az összes alosztálynak ugyanabban a fájlban vagy a sealed osztályon belül kell lennie

Mi az a sealed class és sealed interface?

sealed class egy absztrakt osztály korlátozással: az összes közvetlen alosztályát ugyanabban a fájlban kell deklarálni, mint magát a sealed class-t. Ez a korlátozás zárttá (sealed) teszi a hierarchiát — a fájlon kívüli kód nem adhat hozzá új alosztályt.

sealed interface, Kotlin 1.5-ben hozzáadva, ugyanezt a garanciát nyújtja az interfész rugalmasságával: a sealed interface-t több osztály, objektum vagy más interfész is megvalósíthatja egy fájlban. A sealed class-szal ellentétben a sealed interface nem rendelkezik egyszeres öröklés korlátozással — egy osztály egyszerre több sealed interface-t is megvalósíthat.

A Kotlin Evolution and Roadmap (2026) szerint a sealed interface a közösség kérésére került hozzáadásra a rugalmasabb modellezés érdekében. A fő motiváció a független típusszintek kombinálásának lehetősége volt többszörös osztályöröklés nélkül.

A sealed class szintaxisa

A sealed class deklarálása a sealed módosítóval kezdődik a class előtt. Az alosztályok ugyanabban a fájlban kerülnek deklarálásra.

kotlin
sealed class NetworkResult {
    data class Success(val data: String) : NetworkResult()
    data class Error(val message: String) : NetworkResult()
    object Loading : NetworkResult()
}

Minden sealed class alosztály rendelkezhet saját tulajdonságokkal és metódusokkal. A Loading egy singleton (object), a Success és az Error paraméteres data class. A fordító ismeri mindhárom változatot, és ellenőrzi a teljességüket when használatakor.

Beágyazott sealed class

A sealed osztályok beágyazhatók, többszintű hierarchiákat hozva létre összetett adatmodellekhez a típusbiztonság elvesztése nélkül.

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()
}

A sealed interface szintaxisa (Kotlin 1.5+)

sealed interface hasonlóan deklarálódik, mint a sealed class, de lehetővé teszi több sealed interface megvalósítását egy osztályban.

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

A Navigate osztály egyszerre két sealed interface-t valósít meg — Action és Loggable. Sealed class esetén ez lehetetlen az egyszeres öröklés korlátozása miatt. A sealed interface rugalmasságot biztosít a független hierarchiák kombinálásához.

Mikor válasszuk a sealed interface-t a sealed class helyett

sealed interface előnyösebb, ha a hierarchia nem igényel megosztott állapotot vagy konstruktort. A JetBrains Kotlin Guidelines (2026) szerint a sealed interface-t alapértelmezetten kell használni minden új hierarchiához, ahol nincs szükség közös konstruktorra, így a kód rugalmasabb lesz a jövőbeli bővítésekhez.

Kimerítő feldolgozás a when-ben

A sealed típusok fő előnye a kimerítő (exhaustive) feldolgozás a when kifejezésben. A fordító ellenőrzi, hogy az összes lehetséges alosztály figyelembe lett véve.

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 nem szükséges — a fordító tudja, hogy minden változat lefedve
}

Ha a fejlesztő új alosztályt ad a sealed hierarchiához, de elfelejti feldolgozni a when-ben — a fordító hibát jelez. Ez biztonság típus szinten, amely nem érhető el nyílt hierarchiák használatakor else ággal.

A Google Android Developers (2026) szerint a sealed osztályok az ajánlott módja az UI állapot modellezésének Jetpack Compose-ban. A when kimerítő ellenőrzése megakadályozza azokat a helyzeteket, amikor a fejlesztő nem dolgozta fel a képernyő megjelenítésének összes lehetséges változatát.

A sealed class összehasonlítása az enum class-szal

enum class és sealed class gyakran összekeverik, de eltérő céljaik és képességeik vannak.

Jellemzősealed classenum class
PéldányokTöbb (data class), egy (object)Pontosan egy konstansonként
TulajdonságokEltérő minden alosztálynálAzonos minden konstansnál
ÖröklésIgen (sealed class-tól)Nem (implicit final)
KonstruktorLehetnek paramétereiCsak közös az összes konstanshoz
HierarchiaKorlátozott, sealedRögzített konstanskészlet

A választás a sealed class és enum class között a feladattól függ. Ha a változatok nem hordoznak további adatokat — használjon enum-ot. Ha minden változat egyedi mezőket tartalmaz — használjon sealed class vagy sealed interface-t.

Gyakorlati alkalmazási forgatókönyvek

A sealed típusokat Kotlin-projektekben számos standard forgatókönyvhöz használják, amelyek típusbiztos modellezést igényelnek.

UI állapot Jetpack Compose-ban

Minden Compose képernyő rendelkezhet egy sealed class UiState-val, amely leírja az összes lehetséges állapotot: Idle, Loading, Content(data), Error(exception). A when kifejezés garantálja, hogy az összes állapot feldolgozásra került.

Hálózati kérések eredménye

NetworkResult Success, Error, Loading változatokkal — standard minta Kotlin-projektekben Retrofit és Ktor használatával. A sealed class biztonságos feldolgozást biztosít a kérés minden kimeneteléhez.

Navigáció multi-modul projektekben

sealed interface a navigációs útvonalakhoz lehetővé teszi a modulok számára, hogy saját útvonalaikat deklarálják egy egységes hierarchián belül. Ez kiküszöböli az ismeretlen útvonalakkal kapcsolatos hibákat a fordítási szakaszban.

A KotlinConf (2025) szerint a sealed class és sealed interface a type-safe tervezés alapját képezik a modern Kotlin alkalmazásokban. Data class-szal kombinálják őket összetett domain struktúrák modellezéséhez a fordítási szakasz biztonságának elvesztése nélkül.

Gyakran Ismételt Kérdések

Hol kell deklarálni a sealed class alosztályait?

Az összes közvetlen sealed class alosztályt ugyanabban a fájlban kell deklarálni. A sealed interface-re ugyanez a szabály vonatkozik — a megvalósítások egy fájlban.

Lehet-e a sealed interface-nek megvalósítása másik fájlban?

Nem, az egyfájl szabály a sealed interface-re is vonatkozik. Minden megvalósításnak abban a fájlban kell lennie, ahol a sealed interface deklarálva van.

Mi a különbség a sealed class és a sealed interface között?

sealed interface nem rendelkezik állapottal és konstruktorral, lehetővé teszi a többszörös megvalósítást. sealed class rendelkezhet konstruktorral és megosztott állapottal, de egy osztály csak egy sealed class-t örökölhet.

Hogyan segítenek a sealed osztályok a when kifejezésekben?

A fordító ellenőrzi a when teljességét: ha nem minden alosztály lett feldolgozva, a kód nem fordul le. Ez kiküszöböli a futásidejű hibákat és biztonságosabbá teszi a kódot.

Létrehozható-e sealed class konstruktorral?

Igen, sealed class rendelkezhet konstruktorral (alapértelmezetten private). Az összes alosztály átadhat paramétereket ennek a konstruktornak a super() segítségével.

Összefoglalás

  • sealed class — korlátozott hierarchia fordítási időben ismert alosztályokkal
  • sealed interface — rugalmas alternatíva (Kotlin 1.5+) többszörös megvalósítás támogatásával
  • when — kimerítő feldolgozás fordítói ellenőrzéssel, else nem szükséges
  • Egy fájl — az összes alosztálynak és megvalósításnak egy fájlban kell lennie a sealed típussal
  • Modellezés — UI állapotok, hálózati eredmények, navigáció, eseményrendszerek
  • Biztonság — új alosztály hozzáadása when feldolgozás nélkül fordítási hibát okoz
  • Választás — sealed interface alapértelmezetten előnyösebb, sealed class ha megosztott állapot szükséges

Kulcsrakész mobilalkalmazást fejlesztünk

Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.

Projekt megbeszélése

Olvassa el is