ProgramlamaBackend Geliştirici

Java'da switch ifadesi nedir, klasik switch'den nasıl farklıdır ve kullanımıyla ilgili hangi ince noktalar vardır?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap.

Soru tarihi:

Java 12 öncesinde switch operatörü yalnızca bir statement olarak kullanılıyordu. Java 12/14 ile birlikte switch ifadeleri (switch expression) ortaya çıktı ve operatörün sözdizimini ve olanaklarını genişletti. Switch ifadeleri, daha kısa ve anlamlı bir kod için tasarlanmıştır.

Sorun:

Klasik switch sık sık hatalara neden olur: unutulan break, fall-through'a yol açar, birçok case ile okunabilirliği zorlaştırır, sonucu doğrudan ifade içinde döndürme olanağı yoktur ve değerlerin kapsamlı bir kontrolü mevcut değildir.

Çözüm:

Switch ifadesi bir değer döndürebilir, ok işaretli sözdizimini kullanabilir, derleme aşamasında kapsamlı bir analiz destekleyebilir ve default aracılığıyla null'ı işleyebilir. Sözdizimi:

String result = switch(day) { case MONDAY, FRIDAY -> "Çalışma Günü"; case SATURDAY, SUNDAY -> "Hafta Sonu"; default -> throw new IllegalArgumentException(); };

Ana özellikler:

  • Switch bir ifade haline geldi: sonucu bir değişkene atayabilirsiniz.
  • Yeni sözdizimi okunmayı kolaylaştırır ve unutulan break'leri engeller.
  • Birden fazla etiket desteği (case A, B -> ...).

Kandırmaca soruları.

Switch enum, string ve null ile çalışabilir mi?

Enum ile Java 5'ten itibaren çalışır. String ile Java 7'den itibaren. Null yalnızca default aracılığıyla işlenir, aksi takdirde NPE ile karşılaşılır.

switch(day) { // day == null default: System.out.println("null"); } // çalışır

Eğer switch ifadesinde tüm enum seçeneklerini gerçekleştirmezseniz ne olur?

Derleyici, tüm değerler için default veya implementation talep eder. Bunun yokluğunda bir derleme hatası çıkar.

Yeni tür switch ifadesinde break kullanmak mümkün mü?

Ok işaretli versiyonda break'a gerek yoktur. Eğer bir blok (case X -> { ... }) kullanırsanız, değer döndürmek için yield kullanılabilir:

int num = switch(x) { case 1 -> 10; case 2 -> { yield 20; } default -> 0; };

Tipik hatalar ve anti-paterni

  • Null olmayan türlerle çalışırken default'ın eksikliği, derleme hatasına yol açar.
  • Default dışında null'ı işlemeye çalışmak NullPointerException yaratır.
  • Çok fazla iç içe switch kullanmak, polimorfizme göre tercih edilmelidir.

Gerçek hayattan bir örnek

Olumsuz durum

Klasik switch, break olmadan int ile:

switch(type) { case 1: actionA(); case 2: actionB(); // hem type==1 hem de type==2'de çağrılır }

Artılar:

  • Hızla yazılabilir.

Eksiler:

  • Hatalar kritik hatalara yol açar.
  • Kod okunması ve bakımı zor.

Olumlu durum

Yeni switch ifadesini enum ile sonuç eşleştirmede kullanmak:

String status = switch(orderStatus) { case PAID -> "Ödenmiş"; case CANCELED -> "İptal Edildi"; default -> "İşlemde"; };

Artılar:

  • Kapsamlı analiz - daha az hata.
  • Kod kompakt ve okunabilir.

Eksiler:

  • Java 14+ ve modern sözdizimi bilgisi gerektirir.