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 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 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.
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.
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.
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 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.
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.
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.
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.
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.
enum class és sealed class gyakran összekeverik, de eltérő céljaik és képességeik vannak.
| Jellemző | sealed class | enum class |
|---|---|---|
| Példányok | Több (data class), egy (object) | Pontosan egy konstansonként |
| Tulajdonságok | Eltérő minden alosztálynál | Azonos minden konstansnál |
| Öröklés | Igen (sealed class-tól) | Nem (implicit final) |
| Konstruktor | Lehetnek paraméterei | Csak közös az összes konstanshoz |
| Hierarchia | Korlátozott, sealed | Rö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.
A sealed típusokat Kotlin-projektekben számos standard forgatókönyvhöz használják, amelyek típusbiztos modellezést igényelnek.
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.
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.
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
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.
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.
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.
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.
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
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.
Olvassa el is