Kotlin'deki when yapısı, geleneksel switch-case yerine geçen güçlü bir araçtır ve programın akışını yönetmek için kullanılır. when, ifadeliliği artırmak, boilerplate kodunu azaltmak ve tür güvenliğini artırmak amacıyla tanıtılmıştır.
Java'daki switch-case yapısı belirli türlerle (enum, int, String) sınırlıdır. Java'nın aksine, Kotlin geliştiricileri koşullu dallanmayı daha ifadeli ve güvenli hale getirmek için şartlanmıştır.
Java'daki switch-case kısıtlamaları, özellikle koleksiyonlarla çalışırken, aralıkları karşılaştırırken veya farklı türleri işlerken kodun genişletmesini ve bakımını zordlaştırır.
Kotlin'deki when yapısı evrenseldir: bir ifade olarak çalışabilir (değer döndürebilir), koşul kontrollerini, aralıkları, tekil değerleri, türleri destekler ve koşulları birleştirebilir.
fun describe(obj: Any): String = when (obj) { 1 -> "Bir" in 2..10 -> "İkiden ona" is String -> "Uzunluğu ${obj.length} olan bir String" else -> "Bilinmiyor" } val res1 = describe(1) // "Bir" val res2 = describe(5) // "İkiden ona" val res3 = describe("Kotlin") // "Uzunluğu 6 olan bir String" val res4 = describe(42.0) // "Bilinmiyor"
Argüman olmadan when kullanılabilir mi?
Evet, when belirli bir değişkenin değerini kontrol etmeye gerek yoksa uzun bir if-else zincirinin yerine kullanılabilir.
when { x < 0 -> println("Negatif") x == 0 -> println("Sıfır") else -> println("Pozitif") }
When yapısında else bloğu zorunlu mu?
Tüm olası durumlar ele alındıysa else bloğu zorunlu değildir, örneğin enum veya sealed sınıf için. Ancak, kapatılmamış bir durum olasılığı varsa, derleme hatalarından kaçınmak için else zorunludur.
sealed class Fruit object Apple : Fruit() object Pear : Fruit() fun check(f: Fruit): String = when (f) { Apple -> "Bu bir elma" Pear -> "Bu bir armut" // Else bloğu yok, derleyici uyarı yapmıyor — tüm seçenekler dikkate alınmış }
When içinde bir dalda birden fazla değer kullanılabilir mi?
Evet, birden fazla değer virgülle birleştirilebilir.
when (value) { 0, 1 -> println("Sıfır veya Bir") else -> println("Diğer") }
Bir ödeme sisteminde switch-case, işlem durumunu belirlemek için kullanılır. Yeni bir durum türü eklerken switch'in güncellenmeyi unuttular. İşlenmemiş durum, sessiz hata ile sonuçlanır.
Artıları:
Eksileri:
Kotlin'de durumlar için sealed sınıf kullanılır ve bunları işlemek için when yapısı kullanılır. Yeni bir durum eklediğinde, derleyici yeni durumu işlemek için gerekli eklemeyi talep eder.
Artıları:
Eksileri: