CodeGym /Java Blogu /Rastgele /Java anahtarı Bildirimi
John Squirrels
Seviye
San Francisco

Java anahtarı Bildirimi

grupta yayınlandı

Java Anahtarı hakkında biraz teori

Bir yol ayrımında duran bir şövalye olduğunuzu hayal edin. Sola gidersen atını kaybedersin. Sağa gidersen bilgi edinirsin. Bu durumu kodda nasıl temsil ederiz? Bu kararları vermek için if-then ve if-then-else gibi yapıları kullandığımızı muhtemelen zaten biliyorsunuzdur .

if (turn_left) { 
    System.out.println("You will lose your horse"); 
}
if (turn_right) {
    System.out.println("You will gain knowledge");
}
else 
    System.out.println("So you're just going to stand there?");

Peki ya yol ikiye değil de on parçaya ayrılırsa? "Tamamen sağda", "bunun biraz solunda", "biraz daha solda" vb. Yollarınız var, toplam 10 olası yol var mı? Bu sürümde "eğer-o zaman-else " kodunuzun nasıl büyüyeceğini hayal edin!

if (option1)
{…}
else if (option2)
{…}
…
else if (optionN) ...
Yolda 10 yol ayrımı olduğunu varsayalım (burada seçeneklerin sayısının sınırlı olması önemlidir). Bu tür durumlar için Java'da switch deyimi vardır.

       switch (ExpressionForMakingAChoice) {
           case (Value1):
               Code1;
               break;
           case (Value2):
               Code2;
               break;
...
           case (ValueN):
               CodeN;
               break;
           default:
               CodeForDefaultChoice;
               break;
       }

Bu ifade şu şekilde çalışır:
  • ExpressionForMakingAChoice değerlendirilir. Daha sonra switch deyimi, ortaya çıkan değeri bir sonraki ValueX ile (listelendikleri sırayla) karşılaştırır.
  • ExpressionForMakingAChoice, ValueX ile eşleşirse, iki noktadan sonraki kod yürütülür.
  • Bir break ifadesiyle karşılaşılırsa, kontrol switch ifadesinin dışına aktarılır.
  • ExpressionForMakingAChoice herhangi bir ValueX ile eşleşmezse, kontrol CodeForDefaultCase'e geçer.
Önemli noktalar
  • switch deyiminde, ExpressionForMakingAChoice türü aşağıdakilerden biri olmalıdır:

    • bayt , kısa , karakter , int .
    • Bayt , Kısa , Karakter , Tamsayı (ilkel veri türlerinin sarmalayıcıları).
    • dize .
    • Enum .
  • Varsayılan blok isteğe bağlıdır. Eğer yoksa ve ExpressionForMakingAChoice herhangi bir ValueX ile eşleşmiyorsa hiçbir eylem yürütülmez.
  • break deyimi gerekli değildir . Eğer yoksa, kod, break'in ilk oluşumuna veya switch deyiminin sonuna kadar yürütülmeye devam edecektir (durum ifadelerindeki diğer karşılaştırmalar göz ardı edilerek) .
  • Aynı kodun birkaç seçenek için yürütülmesi gerekiyorsa, birkaç ardışık case ifadesi belirterek tekrarı ortadan kaldırabiliriz.

Şimdi switch ifadesinin Java'da nasıl kullanıldığına bir göz atalım.

Endişelenme: teoriyle işimiz bitti. Aşağıdaki örnekleri gördükten sonra her şey çok daha netleşecek. Pekala, başlayalım. Güneş sistemimizin gezegenlerini içeren astronomiden bir örneğe bakalım. En son uluslararası tutumlara uygun olarak, Plüton'u (yörüngesinin özelliklerinden dolayı) hariç tuttuk. Gezegenlerimizin Güneş'e olan uzaklıklarına göre şu şekilde sıralandığını hatırlıyoruz: Merkür, Venüs, Dünya, Mars, Jüpiter, Satürn, Uranüs ve Neptün. Bir gezegenin sıra numarasını (Güneş'e olan uzaklığına göre) alan ve gezegenin atmosferinin ana bileşenlerini bir List<String> olarak döndüren bir Java yöntemi yazalım.. Bazı gezegenlerin benzer bir atmosferik bileşime sahip olduğunu hatırlayacaksınız. Bu nedenle, Venüs ve Mars esas olarak karbondioksit içerir; Jüpiter ve Satürn'ün atmosferi hidrojen ve helyumdan oluşur; ve Uranüs ve Neptün son gaz çiftine metan ekler. İşte fonksiyonumuz:

public static List<String> getPlanetAtmosphere(int seqNumberFromSun) {
    List<String> result = new ArrayList<>();
    switch (seqNumberFromSun) {
        case 1: result.add("No atmosphere");
            break;
        case 2:
        case 4: result.add("Carbon dioxide");
            break;
        case 3: result.add("Carbon dioxide");
            result.add("Nitrogen");
            result.add ("Oxygen");
            break;
        case 5:
        case 6: result.add("Hydrogen");
            result.add("Helium");
            break;
        case 7:
        case 8: result.add("Methane");
            result.add("Hydrogen");
            result.add("Helium");
            break;
        default:
            break;
    }
    return result;
}
Aynı atmosferik bileşime sahip gezegenler için aynı kodu kullandığımıza dikkat edin. Bunu ardışık vaka ifadeleri kullanarak yaptık . Ana gezegenimizin atmosferinin bileşimini elde etmek istiyorsak, yöntemimizi argüman olarak 3 olarak adlandırırız:

getPlanetAtmosphere(3).
System.out.println(getPlanetAtmosphere(3)) returns ["Carbon dioxide", "Nitrogen", "Oxygen"].
Break ile deneme: Tüm break deyimlerini kaldırırsak ne olur ? Bir deneyelim:

    public static List<String> getPlanetAtmosphere(int seqNumberFromSun) {
        List<String> result = new ArrayList<>();
        switch (seqNumberFromSun) {
            case 1: result.add("No atmosphere");
            case 2:
            case 4: result.add("Carbon dioxide");
            case 3: result.add("Carbon dioxide");
                result.add("Nitrogen");
                result.add ("Oxygen");
            case 5:
            case 6: result.add("Hydrogen");
                result.add("Helium");
            case 7:
            case 8: result.add("Methane");
                result.add("Hydrogen");
                result.add("Helium");
            default:
        }
        return result;
    }
System.out.println(getPlanetAtmosphere(3)) sonucunu yazdırırsak , ana gezegenimizin pek yaşanabilir olmadığını görürüz. Yoksa öyle mi? Kendinize hakim olun: ["Karbondioksit", "Azot", "Oksijen", "Hidrojen", "Helyum", "Metan", "Hidrojen", "Helyum"] . Bu neden oldu? Program, ilk eşleşmeden sonra anahtar bloğunun sonuna kadar tüm case ifadelerini yürütür .

Break ifadelerinin aşırı optimizasyonu

Break deyimlerini ve vakaları farklı şekilde düzenleyerek yöntemi iyileştirebileceğimize dikkat edin .

public static List<String> getPlanetAtmosphere(int seqNumberFromSun) {
    List<String> result = new ArrayList<>();
    switch (seqNumberFromSun) {
        case 1: result.add("No atmosphere");
                break;
        case 3: result.add("Nitrogen");
                result.add ("Oxygen");
        case 2:
        case 4: result.add("Carbon dioxide");
                break;
        case 7:
        case 8: result.add("Methane");
        case 5:
        case 6: result.add("Hydrogen");
                result.add("Helium");
    }
     return result;
}
Daha az kod gibi görünüyor, değil mi? Case ifadelerinin sırası ile oynayarak ve onları yeniden gruplayarak toplam ifade sayısını azalttık. Artık her gaz türü tek bir kod satırıyla listeye ekleniyor. Son örnekte verilen kod, yalnızca işlerin nasıl yürüdüğünü göstermek içindir. Bu şekilde kod yazmayı önermiyoruz. Bu tür Java kodunun yazarı (diğer programcılar şöyle dursun) bunu sürdürmek zorundaysa, bu vaka bloklarının oluşumunun arkasındaki mantığı ve switch deyiminde yürütülen kodu yeniden yapılandırmayı çok zor bulacaktır .

if ile arasındaki farklar

if ve switch deyimlerinin dışa dönük benzerlikleri göz önüne alındığında , switch deyiminin durumlardan birini ÖZEL DEĞER'e göre seçtiğini, halbuki if deyiminin herhangi bir boole ifadesi olabileceğini unutmayın . Kodunuzu tasarlarken bunu aklınızda bulundurun.

Çözüm

  • Kodunuzu if ifadeleriyle karıştırmamak için case ifadesini ikiden fazla dal için kullanın .
  • Bir break deyimi ekleyerek, her belirli değer (case deyimi) için dalın mantıksal bloğunu tamamlamayı unutmayın .
  • switch deyiminin ifadesi , bazı ilkel türlerin yanı sıra bir Enum veya String olabilir .
  • Varsayılan bloğu hatırla . Beklenmeyen değerleri işlemek için kullanın.
  • Performansı optimize etmek için, en yaygın değerlere karşılık gelen kod dallarını anahtar bloğunun başına taşıyın .
  • case deyimlerinin sonundaki break deyimlerini silerek "optimizasyonunuza" kapılmayın - bu tür bir kodun anlaşılması zordur ve sonuç olarak bakımı da zordur.
Yorumlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION