when ile sealed
- Kotlin kursu
- Orta seviye
- Ders 25/116
- 5 dk
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.
Başlangıç kodu
// Status sealed class tanımı
// object Loading ve object Done alt tipleri
// describe fonksiyonu: when ile dallanma
// main'de iki çağrıyı yazdırÖrnek çözüm
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))
}Beklenen çıktı
yükleniyor tamam
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 when + sealed kalıbını eşle
| Kavram | Anlamı |
|---|---|
when (s) { |
Dallanma |
is Loading |
Tür kontrolü |
-> "yükleniyor" |
Dal gövdesi |
else gerekmez |
Exhaustive güvenlik |
2 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 Doğru cevap
- Çünkü when yalnızız tek dal kabul eder
- Çünkü sealed class'ın alt tipi olmaz
Açıklama: Derleyici tüm alt tipleri bildiği için exhaustive dallanma mümkündür.
3 when ifadesini tamamla
fun describe(s: Status): String {
return ____ (s) {
is Loading -> "yükleniyor"
is Done -> "tamam"
}
}
fun describe(s: Status): String {
return when (s) {
is Loading -> "yükleniyor"
is Done -> "tamam"
}
}
Açıklama: when ile sealed class üzerinde exhaustive dallanma yapılır.