CodeGym /Kurslar /JAVA 25 SELF /İnkişaf etmiş switch

İnkişaf etmiş switch-ifadələri

JAVA 25 SELF
Səviyyə , Dərs
Mövcuddur

1. switch-də nə yenidir

Əgər Java-nı 14-dən əvvəlki versiyalarda yazmısınızsa, switch təxminən belə görünürdü:

switch (day) 
{
    case MONDAY:
        System.out.println("Həftənin başlanğıcı!");
        break;
    case FRIDAY:
        System.out.println("Cümə, yaşasın!");
        break;
    default:
        System.out.println("Adi gün.");
        break;
}

Elə də pis deyil, ancaq:

  • break-i unutmaq olmaz (əks halda növbəti case-ə «düşərik» — fall-through).
  • Çox təkrarlanan kod var.
  • Dəyər qaytarmaq istəsəniz, əvvəlcədən dəyişən elan etməli və hər bir case daxilində ona dəyər təyin etməlisiniz.

Java 14+ dedi: bəsdir! switch-i daha rahat və müasir etmək vaxtıdır.

Əsas yeniliklər:

  • Switch artıq ifadədir, təkcə operator deyil — indi dəyər qaytara bilir.
  • İki nöqtə və break əvəzinə oxlu yeni sintaksis ->.
  • Eyni məntiq üçün bir neçə case vergüllə birləşdirilə bilər.
  • Kompilyator bütün variantların emal olunduğunu yoxlayır (xüsusilə enum ilə).
  • “Fall-through” riski yoxdur — bu artıq yalnız açıq şəkildə mümkündür.

2. switch-ifadəsinin sintaksisi


switch (znachenie)
{
   case A, B -> rezul’tat1;
   case C -> {
      // bir neçə əməliyyat
      yield rezul’tat2;
   }
   default -> rezul’tatPoUmolchaniyu;
}
->yield ilə switch-ifadəsinin sintaksisi

Baza nümunə

Gəlin birbaşa işə keçək. İndi switch-dən dəyəri belə qaytarmaq olar:

DayOfWeek day = DayOfWeek.MONDAY;

String message = switch (day) 
{
    case MONDAY, FRIDAY, SUNDAY -> "Qısa həftə və ya istirahət günü!";
    case TUESDAY                -> "Çərşənbə axşamı — ağır gündür.";
    case WEDNESDAY, THURSDAY    -> "Həftənin ortası!";
    case SATURDAY               -> "Yaşasın, şənbə!";
    // Mütləq default olmalıdır, əgər bütün variantlar emal olunmayıbsa
    default                     -> "Qəribə bir gündür...";
};

System.out.println(message);

Burada nə baş verir:

  • switch (day) — dəyər qaytaran ifadədir.
  • Oxdan sonra -> həmin case üçün nəticə göstərilir.
  • Bir neçə case vergüllə birləşdirilə bilər.
  • Heç bir break yoxdur — Java budağın harada bitdiyini özü bilir.
  • Nəticəni dərhal message dəyişəninə mənimsətmək olar.

Rəqəmlərlə nümunə

int code = 404;
String result = switch (code) 
{
    case 200 -> "OK";
    case 400, 404 -> "Müştəri xətası";
    case 500 -> "Server xətası";
    default -> "Naməlum kod";
};
System.out.println(result);

Sətirlərlə nümunə

String command = "start";
String status = switch (command) 
{
    case "start" -> "Başlatma!";
    case "stop" -> "Dayanma!";
    case "pause" -> "Fasilə...";
    default -> "Naməlum əmr";
};
System.out.println(status);

yield ilə blokdan istifadə

Bəzən bir case üçün bir neçə əməliyyat icra etmək istəyirsiniz (məsələn, nəsə mürəkkəb hesablanır və ya loq yazılır). Bunun üçün { ... } bloku və yield açar sözündən istifadə etmək olar:

int n = 7;
String parity = switch (n % 2) 
{
    case 0 -> "Cüt";
    case 1 -> 
    {
        System.out.println("Tək ədəd aşkarlandı: " + n);
        yield "Tək";
    }
    default -> "Nəsə qəribədir";
};
System.out.println(parity);

Vacibdir: blok daxilində həmin case üçün dəyəri qaytaran yield mütləq olmalıdır.

3. Yeni sintaksisin üstünlükləri

break-ə ehtiyac yoxdur

Klassik switch-də unudulmuş break ağrı və müəmmalı bug-ların mənbəyidir. Yeni sintaksisdə break ümumiyyətlə lazım deyil: hər budaq avtomatik tamamlanır.

Kompilyator bütün variantların emalını yoxlayır

Əgər enum istifadə edirsinizsə və bütün dəyərləri emal etməmisinizsə — kompilyator default olmadan layihəni yığmağa icazə verməyəcək. Bu, kodu daha etibarlı edir.

“Fall-through” yoxdur

Klassik switch-də əgər break unudularsa, icra növbəti case-ə “düşür”. Yeni sintaksisdə bu mümkün deyil (yalnız siz blokdan istifadə edib açıq şəkildə break yazsanız — amma burada o da lazım deyil).

Kod daha yığcam və oxunaqlıdır

Özünüz müqayisə edin:

Əvvəl:

String result;
switch (status) {
    case "OK":
        result = "Hər şey yaxşıdır";
        break;
    case "ERROR":
        result = "Xəta";
        break;
    default:
        result = "Naməlumdur";
        break;
}

Sonra:

String result = switch (status) {
    case "OK" -> "Hər şey yaxşıdır";
    case "ERROR" -> "Xəta";
    default -> "Naməlumdur";
};

Bir neçə case — bir məntiq

case MONDAY, FRIDAY, SUNDAY -> "İstirahət və ya qısa iş günü!";

4. Klassik switch ilə müqayisə

Xüsusiyyət Klassik switch Yeni switch
break məcburidir Bəli Xeyr
Fall-through Bəli Xeyr
Dəyər qaytara bilər Xeyr (yalnız dəyişən vasitəsilə) Bəli (ifadə)
Bir neçə case vergüllə Xeyr Bəli
Bütün variantların yoxlanması Xeyr Bəli (xüsusilə enum ilə)
Yığcamlıq Çox kod Qısa və aydın
enum və sətirlərlə istifadə Bəli Bəli

5. enum və sətirlərlə uyğunluq

enum ilə nümunə

Tutaq ki, belə bir enum var:

enum DayOfWeek 
{
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}

Onu yeni switch-də istifadə edək:

DayOfWeek today = DayOfWeek.WEDNESDAY;

String mood = switch (today) 
{
    case MONDAY -> "Yuxudan durmaq çətindir...";
    case FRIDAY -> "Tezliklə istirahətdir!";
    case SATURDAY, SUNDAY -> "Yaşasın, istirahət!";
    default -> "İş günüdür.";
};
System.out.println(mood);

String ilə nümunə

String season = "summer";
String activity = switch (season) 
{
    case "winter" -> "Konki sürmək";
    case "summer" -> "Göldə üzmək";
    case "autumn" -> "Göbələk yığmaq";
    case "spring" -> "Quşların nəğməsini dinləmək";
    default -> "Naməlum fəsil";
};
System.out.println(activity);

6. Köhnə switch-i yeni üsluba keçirmək

Əvvəl:

int day = 3;
String dayName;
switch (day) 
{
    case 1:
        dayName = "Bazar ertəsi";
        break;
    case 2:
        dayName = "Çərşənbə axşamı";
        break;
    case 3:
        dayName = "Çərşənbə";
        break;
    default:
        dayName = "Naməlum gün";
        break;
}
System.out.println(dayName);

Sonra:

int day = 3;
String dayName = switch (day) 
{
    case 1 -> "Bazar ertəsi";
    case 2 -> "Çərşənbə axşamı";
    case 3 -> "Çərşənbə";
    default -> "Naməlum gün";
};
System.out.println(dayName);

Daha bir nümunə: bir neçə case — bir məntiq

int score = 5;
String grade = switch (score) 
{
    case 5, 6, 7 -> "Yaxşı";
    case 8, 9, 10 -> "Əla";
    default -> "Daha çox çalışmaq lazımdır";
};
System.out.println(grade);

7. Tipik səhvlər və xüsusiyyətlər

Səhv №1: bütün variantlar emal olunmayıbsa, default-un olmaması. Əgər int və ya String kimi sadalanan case-lərdən kənar dəyərlərə malik ola bilən tiplərlə switch-ifadəsi istifadə edirsinizsə, kompilyator default tələb edəcək. enum üçün də, bütün dəyərlər emal olunmayıbsa, default mütləqdir.

Səhv №2: blokda yield unudulub. Əgər case üçün fiqurlu mötərizələrdən istifadə edirsinizsə (bir neçə əməliyyat yerinə yetirilməlidir), yield-i unutmayın — onsuz kompilyator belə bir səhv verəcək: "Missing yield statement".

Səhv №3: tiplərin uyğunsuzluğu. Bütün switch-ifadə budaqları eyni tipdə dəyərlər qaytarmalıdır; əks halda kompilyator koda icazə verməyəcək.

Səhv №4: case dəyərlərinin təkrarı. Eyni case-i iki dəfə göstərmək olmaz — kompilyator dərhal səhv barədə xəbər verəcək.

1
Sorğu/viktorina
, səviyyə, dərs
Əlçatan deyil
Konstantlar, enum və switch
Konstantlar, enum və switch
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION