Çok koşullu kod yazarken, mutlaka bir if-else veya switch ifadesi kullanmışsınızdır . Ancak if-else'ye bu alternatifin dezavantajları vardır. Hatta bazı insanlar switch deyimini "anti-kalıp" olarak adlandırdı .

Bu da ne? Bir anti-kalıp, kötü kodun yaygın bir kalıbıdır, yani bir soruna kötü bir çözümdür. Programcılar, kod kalitesini düşürdükleri için kodda bunlardan kaçınmaya çalışırlar.

Ancak iyi haberler var: Java'nın yeni sürümleri, dilin sözdiziminde pek çok değişiklik getirdi ve bu değişikliklerden biri switch'i etkiliyor . İlginizi mi çekti? O zaman gidip dalalım.

Başlamak için, anahtarın neden bir anti-kalıp olduğunu açıklamaya değer . Aşağıdaki kodu göz önünde bulundurun:


switch (condition) {
    case "DECEMBER":
        seasonNumber = 1;
        break;
    case "JANUARY":
        seasonNumber = 1;
        break;
    case "FEBRUARY":
        seasonNumber = 1;
        break;
    default:
        seasonNumber = 0;
}

Tamam, bunun neden bir "anti-kalıp" olduğu henüz tam olarak belli değil.

Peki ya daha fazla durum bloğu eklersek ve şimdi kod şöyle görünürse:


switch (condition) {
    case "DECEMBER":
        seasonNumber = 1;
        break;
    case "JANUARY":
        seasonNumber = 1;
        break;
    case "FEBRUARY":
        seasonNumber = 1;
        break;
    case “MARCH”:
        seasonNumber = 2;
        break;
    case “APRIL”:
        seasonNumber = 2;
        break;
    case “MAY”:
        seasonNumber = 2;
        break;
    default:
        seasonNumber = 0;
}

Birkaç satır daha ekleyelim - kod uzar. Daha sonra daha fazla satır ekleyebiliriz ve kimse bizi bunu yapmaktan alıkoyamaz.

Sorunun özü budur: Başlangıçta kompakt bir switch deyimi oluşturduktan sonra, ona giderek daha fazla kod ekleyerek ekrana sığdığından daha fazla yer kaplarız ve kodun okunmasını ve bakımını elverişsiz hale getiririz.

switch ifadesi ile switch ifadesi arasındaki fark

Java 14, yeni ve geliştirilmiş bir anahtarı tanıttı. Bu bir switch ifadesi değil , bir switch ifadesidir .

Fark nedir, soruyorsun? Aradaki fark, bir ifadenin belirli bir dizi işlemi gerçekleştiren bir talimat olması, ancak bir ifadenin bazı hesaplamalar yapan ve bir sonuç döndüren bir kod parçası olmasıdır.

Başka bir deyişle, artık bir değişkene geçişin sonucunu kaydedebilirsiniz .

Yeter konuşma. Şimdi yeni anahtarın nasıl göründüğüne bakalım :


var result = switch(month) {
     case DECEMBER, JANUARY, FEBRUARY -> 1;
     case MARCH, APRIL, MAY -> 2;
    case JUNE, JULY, AUGUST -> 3;
    case SEPTEMBER, OCTOBER, NOVEMBER -> 4;
    default -> 0; 
};

Gözünüze çarpan ilk şey, kodun ne kadar kompakt olduğudur. Eskiden ekranın çoğunu kaplayan kod artık birkaç satıra yayılıyor ve çok daha okunabilir görünüyor.

-> operatör

Ayrıca -> operatörünü (ok operatörü) not etmelisiniz . Lambda ifadeleriyle ilgili deneyiminiz varsa zaten aşina olabilirsiniz.

Bu, artık bir lambda ifadesi tarzında havalı görünen bir anahtar yazabileceğiniz anlamına gelir . Ok operatörü, derleyicinin bir sonraki vaka ifadesine geçmeyeceğini (geçerli vaka bloğunda bir break veya return ifadesi yoksa), bunun yerine size okun sağındaki ifadenin değerini vereceğini belirtir.

Ayrıca bir ifade olmayan ve herhangi bir şey döndürmek yerine yalnızca belirli eylemleri gerçekleştiren bir kod da yazabilirsiniz:


switch(condition) {
    case TRUE, FALSE -> System.out.println("True/false");
  
    default -> System.out.println("Another");
}

Switch'in artık bir break ifadesi olmadığını unutmayın . Java 13'te kaldırıldı ve yerine verim geldi .

Verim nedir ve nerelerde kullanılabilir?

Bir anahtar tek bir satırdan oluştuğunda, -> operatörünün kendisi değeri döndürür. Peki ya bir değil birçok kod satırımız varsa? Bu gibi durumlarda, bir değil birden çok satır olduğu için ok operatörü bir değer döndürmez.

Belki geri dönüş kullanabiliriz ? Sonuçta, Java'da değerleri döndürmek için kullanılır. Ne yazık ki hayır, dönüş bir anahtarla çalışmaz. Peki ne kullanabiliriz? Eskiden break vardı , ancak bu Java 13'te kaldırıldı. Ancak artık onun yerine, bir anahtardan değer döndürmenize yardımcı olan yeni bir anahtar kelime olan verim var. Yöntemlerdeki ifadeleri döndürmeye benzer .


var result = switch(condition) {
//…
case "Hi" -> "greeting"
//…
};  

Bu kod tek bir satır içerir ve -> operatörü "tebrik" döndürür.

Ancak bir kod bloğumuz olduğunda:


var result = switch(condition) {
//…
case "Hi" -> {
// Your code
 Here you need to return "greeting"
	}
};  

Bir değer döndürmenize yardımcı olacak anahtar kelime verimdir :


var result = switch(condition) {
//…
case "Hi" -> {
// Your code
 yield "greeting";

	}
};

Bir vaka bloğunda birden fazla kod satırına sahip olduğumuz ve bir sonuç döndürmemiz gereken durumlar için Java 13'te verim eklendi.

Muhtemelen kodunuzdaki yeni anahtarı denemeye can atıyorsunuz , ancak bunu yapmak için Java 14 veya üstüne ihtiyacınız olduğunu unutmayın. Önceki sürümlerde, bu anahtar yalnızca komut satırında "--enable-preview" bayrağını belirtirseniz kullanılabilir olacaktır, çünkü sürüm 14'ten önce dilin tam teşekküllü bir parçası değil, teknik ön izlemenin bir parçasıydı.

Şimdilik bu kadar! Görüşürüz!