sealed class ve sealed interface Kotlin'de sınırlı tür hiyerarşisi mekanizmalarıdır; burada olası tüm alt sınıflar derleme zamanında bilinir. Sıradan soyut sınıfların aksine, sealed class when ifadesinde tüm varyantların kapsamlı bir şekilde işlenmesini garanti eder. JetBrains Kotlin Language Guide (2026) belgelerine göre, sealed türleri Kotlin projelerinde durumları, UI ekranlarını ve sonuç türlerini modellemek için temel oluşturur.
Önemli Noktalar
sealed class, bir kısıtlamaya sahip soyut bir sınıftır: tüm doğrudan alt sınıfları, sealed sınıfın kendisiyle aynı dosyada bildirilmelidir. Bu kısıtlama, hiyerarşiyi kapalı (sealed) hale getirir — dosyanın dışındaki hiçbir kod yeni bir alt sınıf ekleyemez.
sealed interface, Kotlin 1.5'te eklenmiştir, aynı garantiyi ancak bir arayüzün esnekliğiyle sağlar: bir sealed interface, bir dosyada birden çok sınıf, nesne veya diğer arayüzler tarafından uygulanabilir. sealed class'ın aksine, sealed interface'de tek miras kısıtlaması yoktur — bir sınıf aynı anda birden çok sealed arayüzü uygulayabilir.
Kotlin Evolution and Roadmap'e (2026) göre, sealed interface daha esnek modelleme için topluluk talebi üzerine eklenmiştir. Ana motivasyon, çoklu sınıf mirası olmadan bağımsız tür hiyerarşilerini birleştirme yeteneğidir.
Sealed class bildirimi, class'tan önce sealed değiştiricisi ile başlar. Alt sınıflar aynı dosyada bildirilir.
sealed class NetworkResult {
data class Success(val data: String) : NetworkResult()
data class Error(val message: String) : NetworkResult()
object Loading : NetworkResult()
}
Sealed class'ın her alt sınıfı kendi özelliklerine ve yöntemlerine sahip olabilir. Loading bir singleton'dır (object), Success ve Error parametreli data class'lardır. Derleyici üç varyantı da bilir ve when'de kullanıldıklarında eksiksizliklerini kontrol eder.
Sealed sınıflar iç içe geçmiş olabilir ve tür güvenliğini kaybetmeden karmaşık veri modelleri için çok seviyeli hiyerarşiler oluşturabilir.
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, sealed class'a benzer şekilde bildirilir, ancak tek bir sınıfta birden çok sealed arayüzün uygulanmasına izin verir.
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
Navigate sınıfı aynı anda iki sealed arayüzü uygular — Action ve Loggable. Bu, tek miras kısıtlaması nedeniyle sealed class ile mümkün değildir. sealed interface, bağımsız hiyerarşileri birleştirme esnekliği sağlar.
sealed interface, hiyerarşinin paylaşılan durum veya kurucu gerektirmediği durumlarda tercih edilir. JetBrains Kotlin Guidelines'a (2026) göre, ortak bir kurucunun gerekli olmadığı tüm yeni hiyerarşiler için varsayılan olarak sealed interface kullanılmalıdır, bu da kodu gelecekteki uzantılar için daha esnek hale getirir.
Sealed türlerinin ana avantajı, when ifadesinde kapsamlı (exhaustive) işlemedir. Derleyici, olası tüm alt sınıfların kapsandığını kontrol eder.
fun handleResult(result: NetworkResult): String = when (result) {
is NetworkResult.Success -> "Data: ${result.data}"
is NetworkResult.Error -> "Error: ${result.message}"
is NetworkResult.Loading -> "Loading..."
// else gerekli değildir — derleyici tüm varyantların kapsandığını bilir
}
Eğer bir geliştirici sealed hiyerarşiye yeni bir alt sınıf ekler ancak bunu when'de işlemeyi unutursa — derleyici hata verecektir. Bu, else dalını kullanan açık hiyerarşilerde bulunmayan tür düzeyinde güvenliktir.
Google Android Developers'a (2026) göre, sealed sınıflar Jetpack Compose'da UI durumunu modellemek için önerilen yöntemdir. when'in kapsamlı kontrolü, geliştiricinin bir ekranın tüm olası görüntüleme varyantlarını işlemediği durumları önler.
enum class ve sealed class sıklıkla karıştırılır, ancak farklı amaçları ve yetenekleri vardır.
| Özellik | sealed class | enum class |
|---|---|---|
| Örnekler | Birden çok (data class), tek (object) | Her sabit için tam olarak bir |
| Özellikler | Her alt sınıf için farklı | Tüm sabitler için aynı |
| Miras | Evet (sealed class'tan) | Hayır (örtük final) |
| Kurucu | Parametrelere sahip olabilir | Sadece tüm sabitler için ortak |
| Hiyerarşi | Sınırlı, sealed | Sabitlerin sabit kümesi |
Sealed class ve enum class arasındaki seçim göreve bağlıdır. Varyantlar ek veri taşımıyorsa — enum kullanın. Her varyant benzersiz alanlar içeriyorsa — sealed class veya sealed interface kullanın.
Sealed türleri, tür güvenli modelleme gerektiren bir dizi standart senaryo için Kotlin projelerinde kullanılır.
Her Compose ekranı, olası tüm durumları tanımlayan bir sealed class UiState'e sahip olabilir: Idle, Loading, Content(data), Error(exception). when ifadesi, tüm durumların işlenmesini garanti eder.
NetworkResult, Success, Error, Loading varyantlarıyla Retrofit ve Ktor kullanan Kotlin projelerinde standart bir kalıptır. sealed class, her istek sonucunun güvenli bir şekilde işlenmesini sağlar.
sealed interface navigasyon rotaları için modüllerin birleşik bir hiyerarşi içinde kalarak kendi rotalarını bildirmelerine olanak tanır. Bu, derleme zamanında bilinmeyen rotalarla ilgili hataları ortadan kaldırır.
KotlinConf'a (2025) göre, sealed class ve sealed interface modern Kotlin uygulamalarında tür güvenli tasarımın temelidir. Derleme zamanında güvenliği kaybetmeden karmaşık alan yapılarını modellemek için data class ile birleştirilirler.
Sıkça Sorulan Sorular
Sealed class'ın tüm doğrudan alt sınıfları aynı dosyada bildirilmelidir. Sealed interface için de aynı kural geçerlidir — uygulamalar tek bir dosyada.
Hayır, tek dosya kuralı sealed interface için de geçerlidir. Tüm uygulamalar, sealed interface'in bildirildiği dosyada olmalıdır.
sealed interface durumu veya kurucusu yoktur ve çoklu uygulamaya izin verir. sealed class bir kurucuya ve paylaşılan duruma sahip olabilir, ancak bir sınıf yalnızca bir sealed class'tan miras alabilir.
Derleyici when'in eksiksizliğini kontrol eder: tüm alt sınıflar işlenmezse, kod derlenmez. Bu, çalışma zamanı hatalarını ortadan kaldırır ve kodu daha güvenli hale getirir.
Evet, bir sealed class bir kurucuya sahip olabilir (varsayılan olarak private). Tüm alt sınıflar, super() aracılığıyla bu kurucuya parametreler iletebilir.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun