Kotlin'de sealed class, alt sınıf hiyerarşisini kısıtlayan bir soyut sınıftır: tüm alt türler bir dosyada tanımlanmalıdır. Bu, alternatiflerin setinin sabit olduğu hiyerarşiler için kullanışlıdır (örneğin, durumlar, olaylar veya hataları tanımlamak için):
sealed class Result { object Success : Result() data class Error(val message: String) : Result() object Loading : Result() } fun handle(result: Result) = when (result) { is Result.Success -> print("Başarı!") is Result.Error -> println("Hata: ${result.message}") is Result.Loading -> println("Yükleniyor...") }
When ile İlişki: Tüm sealed class alt türlerini when ifadesinde kullanıyorsak, derleyici kapsamlılık (exhaustiveness) kontrolü yapar. Bu, yeni bir durum eklenirse, geliştiricinin yeni alternatifin işlenmediği durumlarda bir derleme hatası almasını garanti eder.
Bunun Önemi:
"Sealed class alt türlerini farklı dosya veya paketlerde tanımlamak mümkün mü? Bu type-safety'yi nasıl etkiler?"
Cevap: Hayır, sealed class'ın tüm doğrudan alt türleri tek bir dosyada tanımlanmalıdır. Bu, type-safety'nin garantileri için derleyici kontrolüdür. Alt türler diğer dosyalar içinde yer alırsa, derleyici hata verir.
Hikaye
Ödeme iş mantığı tasarlanırken, işlem sonuçları için alternatifler eklenip, when ifadesinin güncellenmesi unutuldu. Ancak sealed class sayesinde, derleyici dikkate alınmayan durumları belirtti. Başka bir Java projesinde bu senaryo, başlatılmamış bir durumu ürüne götürebilirdi.
Hikaye
Projede sealed class'ın bazı verileri, normal open class'lara geçiş yaptıktan sonra, kapsamlı when kontrolleri çalışmamaya başladı — yeni durumlar işleme mantığında "kaybolmaya" başladı, bu da kullanıcı arayüzünün hatalı davranışına yol açtı.
Hikaye
E-ticaret sisteminde, sealed class alt türlerinin ayrı dosyalara çıkarılması (her biri, tekrar kullanım için farklı bir modülde) üzerinden mimarinin optimize edilmesi denendi. Bu, derlemeyi bozdu ve yayım öncesinde acil bir yeniden yapılandırmayı gerektirdi.