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;
}
-> və
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.
GO TO FULL VERSION