Sorunun geçmişi:
sealed modifikantı ile birlikte arayüzler, Kotlin'de sealed class konseptinin bir gelişimi olarak ortaya çıktı. Kotlin 1.5'ten önce sadece sealed sınıflar, olası mirasçıların kümesini sınırlamaya izin veriyordu, bu da durum hiyerarşileri (state machines, DSL vb.) ile güvenli çalışmak için özellikle önemliydi. Sealed arayüzler tanıtarak, geliştiriciler benzer şekilde, arayüz uygulamalarını sınırlama imkanı sağladılar, sınıflara bağımlı kalmadan.
Sorun:
Herkese açık bir arayüz, programda her yerde uygulanabilir, bu da uygulanmaların kontrolsüz bir şekilde artmasına ve kod bakımının zorlaşmasına yol açabilir. when ifadesi ile işlenirken, derleyici göz önüne alınmamış dallar hakkında uyarı veremez.
Çözüm:
Sealed interface, yalnızca aynı modülde (veya arayüz top-level değilse aynı dosyada) tanımlanan uygulamalarla sınırlıdır. Bu tür bir kontrol, güvenli enum-benzeyen yapılar, ADT modeli ve durum işleyicileri için uygulanır. Derleyici tüm uygulamaları bilir ve kod analizi sırasında yardımcı olur.
Kod Örneği:
sealed interface NetworkResult class Success(val data: String): NetworkResult class Error(val cause: Throwable): NetworkResult object Loading: NetworkResult fun handleResult(result: NetworkResult): String = when (result) { is Success -> "Başarı: ${result.data}" is Error -> "Hata: ${result.cause.message}" Loading -> "Yükleniyor..." }
Ana özellikler:
when ifadesi ile çalışır: derleyici exhaustiveness kontrolü yapar.Sealed arayüzü mevcut dosya dışında uygulamak mümkün mü?
Cevap: Sealed sınıflardan farklı olarak, sealed arayüzler diğer dosyalarda uygulanabilir, ancak yalnızca mevcut modül içinde (veya arayüz top-level değilse, derleme biriminde).
Sealed arayüzler varsayılan uygulamalara sahip açık metodlar içerebilir mi?
Evet, normal arayüzler gibi, sealed arayüz de fonksiyonların varsayılan uygulamalarını içerebilir.
sealed interface Mode { fun description(): String = "Bilinmeyen mod" }
Standart serileştiriciler (örneğin, kotlinx.serialization) ile sealed arayüzü serileştirmek mümkün mü?
Mümkündür, ancak tüm uygulamaları açıkça belirtmek gerekecektir. Kotlinx.serialization'da sealed arayüzlerin desteği hemen gelmedi, serileştirilebilir türlerin açıkça belirtilmesi önemlidir.
Projenin tüm UI durumları için kapsamlı bir arayüz tanımlandı, ancak uygulamalar uygulamanın farklı kısımlarında görünmeye başladı. Yeni bir durum türü eklendi ve işleme bloğu güncellenmeyi unuttu, bu da yeni durumun günlüklerde göz ardı edilmesine yol açtı.
Artılar:
Eksiler:
Tüm ağ yanıtları için sealed arayüzü kullandık. Böylece yeni bir yanıt türü eklendiğinde, IDE hemen where ifadesi ile işlenmenin geçtiği tüm yerleri vurguladı. Hata hemen düzeltildi, mantıkta beklenmedik boşluklar yok.
Artılar:
Eksiler: