CodeBlanks Logo Icon CodeBlanks

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.

Başlangıç kodu

Main.kt
// 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

Main.kt
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

Soru
fun describe(s: Status): String {
    return ____ (s) {
        is Loading -> "yükleniyor"
        is Done -> "tamam"
    }
}
Cevap
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.

Orta seviye bölümündeki tüm dersler