Java’nın ilk sürümlerinden beri kullandığımız switch, uzun yıllar boyunca oldukça basit bir kontrol yapısı olarak kaldı. Bir değer alınır, uygun case bulunur ve ilgili kod çalıştırılırdı. Ancak modern Java sürümleriyle birlikte switch ciddi bir dönüşüm geçirdi.
Artık switch;
- Bir expression olarak değer döndürebiliyor.
->sözdizimi sayesindebreakihtiyacını ortadan kaldırabiliyor.yieldile blok içerisinden değer üretebiliyor.String,enumve primitive değerlerin ötesinde type pattern kullanabiliyor.nulldeğerini doğrudan ele alabiliyor.whenile koşullu pattern’ler oluşturabiliyor.- Sealed class/interface yapılarıyla birlikte exhaustive type kontrolü sağlayabiliyor.
Bu yazıda klasik Java switch yapısından başlayarak modern Java’daki switch kullanımına kadar gelen değişiklikleri adım adım inceleyeceğiz.
1. Klasik Java switch ve Yeni Kullanımı
Uzun yıllar boyunca Java’da switch aşağıdaki şekilde kullanıldı:
int day = 2;
String dayName;
switch (day) {
case 1:
dayName = "Pazartesi";
break;
case 2:
dayName = "Salı";
break;
case 3:
dayName = "Çarşamba";
break;
default:
dayName = "Bilinmeyen gün";
}Buradaki en önemli problem break kullanımıdır.
Bir case içerisinde break unutulursa Java bir sonraki case bloğunu da çalıştırmaya devam eder. Buna fall-through denir.
Örneğin:
int value = 1;
switch (value) {
case 1:
System.out.println("Bir");
case 2:
System.out.println("İki");
}Çıktı Bir ve İki olacaktır. Çünkü case 1 sonrasında break bulunmamaktadır. Fall-through bazı özel durumlarda bilinçli olarak kullanılabilse de uygulama kodunda hata kaynağı olabilmektedir.
Modern switch yapısındaki ilk büyük değişikliklerden biri tam olarak bu problemi çözmektedir. Bu problem aşmak için Java 12 ile başlayıp Java 14 ile (JEP 361) ile standart hale geldi. Şöyle ki;
int day = 2;
switch (day) {
case 1 -> System.out.println("Pazartesi");
case 2 -> System.out.println("Salı");
case 3 -> System.out.println("Çarşamba");
default -> System.out.println("Bilinmeyen gün");
}
Burada artık break kullanmamıza gerek yoktur.
Daha da önemlisi -> kullanılan case yapılarında klasik switch’teki implicit fall-through davranışı bulunmaz. Yani case 1 -> System.out.println(“Bir”);çalıştıktan sonra program otomatik olarak sonraki case bloğuna geçmez.Bu yapı hem daha kısa hem de daha güvenlidir.
2. Birden fazla Değeri Aynı Case içinde kullanmak
Klasik switch’te aynı işlemi gerçekleştiren birden fazla değer için genellikle şöyle bir kullanım görürdük:
switch (day) {
case 6:
case 7:
System.out.println("Hafta sonu");
break;
default:
System.out.println("Hafta içi");
}Modern syntax ile bunu çok daha temiz yazabiliriz:
switch (day) {
case 6, 7 -> System.out.println("Hafta sonu");
default -> System.out.println("Hafta içi");
}
Özellikle çok sayıda sabit değerin aynı davranışı göstermesi gerektiğinde bu kullanım kodun okunabilirliğini ciddi şekilde artırır.
3. Switch artık bir Expression Olabilir
Modern switch yapısının en önemli özelliklerinden biri, artık yalnızca bir statement değil aynı zamanda bir expression olarak kullanılabilmesidir.
Klasik yaklaşım;
String result;
switch (day) {
case 1:
result = "Pazartesi";
break;
case 2:
result = "Salı";
break;
default:
result = "Bilinmiyor";
}
Modern yaklaşım:
String result = switch (day) {
case 1 -> "Pazartesi";
case 2 -> "Salı";
default -> "Bilinmiyor";
};Burada switch(day) doğrudan bir değer üretmektedir. Bu nedenle sonucu bir değişkene atayabiliriz. Hatta doğrudan bir metoddan değer dönderebiliriz.
public String getDayName(int day) {
return switch (day) {
case 1 -> "Pazartesi";
case 2 -> "Salı";
case 3 -> "Çarşamba";
default -> "Bilinmiyor";
};
}Bir sonraki yazımızda switch ile ilgili yazı serimize devam edeceğiz. Sağlıcakla kalın 🙂

Bir yanıt yazın