Kotlin
when ile sealed
when ile sealed class üzerinde exhaustive dallanma öğrenirsin.
when ve exhaustive
Bir sealed class üzerinde when kullanırsan, derleyici tüm alt tipleri bildiği için exhaustive (tam) dallanma mümkündür. else dalı gerekmez.
Örnek: when (s) { is Loading -> "yükleniyor"; is Done -> "tamam" }. Bu ifade tüm alt tipleri kapsadığı için bir değer döndürür ve else gerekmez. Yeni bir alt tip eklersen, derleyici when'i uyumsuz bulur ve seni tüm dalları güncellemeye zorlar. Bu, sealed class'ların en büyük güvenlik avantajıdır.
else neden gerekmez
Sealed class üzerinde when kullandığında else yazmak zorunda değilsin. Derleyici tüm alt tipleri bildiği için dalların tamamlayıcı olduğunu denetler.
Örnek: fun describe(s: Status): String = when (s) { is Loading -> "yükleniyor"; is Done -> "tamam" }. Bu fonksiyon bir String döndürür ve hiçbir dal eksik değildir. Eğer yarın Status'e Error alt tipi eklersen, derleyici describe fonksiyonunu hatalı işaretler; böylece yeni durumu unutmazsın. Bu, açık hiyerarşilerde mümkün olmayan bir güvenliktir.
Uygulama Status üzerinde when ile dallanma
Status adında bir sealed class tanımla. İki alt tip ekle: object Loading : Status() ve object Done : Status(). describe(s: Status): String fonksiyonu yaz; gövdesi when (s) ile Loading için "yükleniyor", Done için "tamam" döndürsün. main içinde describe(Loading) ve describe(Done) çağrılarını println ile yazdır.
Örnek çözümü göster
sealed class Status
object Loading : Status()
object Done : Status()
fun describe(s: Status): String {
return when (s) {
is Loading -> "yükleniyor"
is Done -> "tamam"
}
}
fun main() {
println(describe(Loading))
println(describe(Done))
}
Kendini test et
-
when + sealed kalıbını eşle
- when (s) {
- Dallanma
- is Loading
- Tür kontrolü
- -> "yükleniyor"
- Dal gövdesi
- else gerekmez
- Exhaustive güvenlik
-
Bir sealed class üzerinde <code>when</code> kullanırken <code>else</code> dalı neden genellikle gerekmez?
- Çünkü sealed class abstract'tır
- Çünkü derleyici tüm alt tipleri bilir ve dalları tamamlar
- Çünkü when yalnızız tek dal kabul eder
- Çünkü sealed class'ın alt tipi olmaz
Cevabı göster
Çünkü derleyici tüm alt tipleri bilir ve dalları tamamlar — Derleyici tüm alt tipleri bildiği için exhaustive dallanma mümkündür.
-
when ifadesini tamamla
fun describe(s: Status): String {
return ____ (s) {
is Loading -> "yükleniyor"
is Done -> "tamam"
}
}
Cevabı göster
fun describe(s: Status): String {
return when (s) {
is Loading -> "yükleniyor"
is Done -> "tamam"
}
}
Sıradaki ders: Sealed ve data