Sizga katta miqdordagi shartlar bilan if-else yoki switch ni ishlatish ehtimoli bor. Lekin bu alternativada foydalanishning kamchiliklari bor: xalq orasida switch ni hatto “antipattern” deb atashadi.
| Nima bu? Antipattern — bu yomon kodning shabloni, yomon muammoni yechish. Dasturlashda ulardan foydalanmaslikka harakat qilishadi, chunki ular kod sifatini pasaytiradi. |
Lekin yaxshi yangiliklar ham bor: Java ning yangi versiyalari chiqishi bilan tilning sintaksisida ko'p narsa o'zgardi, va o'zgarishlardan biri switch ni ham qamrab oldi. Qiziqmi? Unda kel, batafsil tushunib chiqamiz.
Avvaliga switch — bu nimaga antipattern ekanligini aniqlab olaylik. Quyidagi kodni ko'rib chiqamiz:
switch (condition) {
case "DECEMBER":
seasonNumber = 1;
break;
case "JANUARY":
seasonNumber = 1;
break;
case "FEBRUARY":
seasonNumber = 1;
break;
default:
seasonNumber = 0;
}
Hozircha nima uchun bu "antipattern" ekanligi tushunarsiz, haqiqatdan ham.
Lekin agar biz qo'shimcha case bloklarini qo'shsak, kod quyidagicha ko'rinadimi?
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;
}
Yana bir necha satr qo'shsak, kod uzunroq bo'ladi. Keyin yana va yana satrlarni qo'shish mumkin, va bunga hech narsa to'sqinlik qilmaydi.
Shuning o'zi asosiy muammo: boshlang'ich kichik va ixcham switch yaratgan holda, biz unga yana va yana ko'p kod qo'shamiz, natijada ko'rinib turgan ekran o'lchamidan uzoqlashamiz va u o'qish va qo'llab-quvvatlash uchun noqulay bo'lib qoladi.
switch statement va switch expression o'rtasidagi farq
Java 14 da yangi switch chiqdi, yaxshilangani bilan. Endi bu switch statement emas, balki switch expression hisoblanadi.
Siz so'raysiz, farqi nimada? Shunda, statement – bu kodda bajariladigan instruktsiya, expression esa natijani chiqaradigan va qandaydir hisob-kitob qiladigan kod qismlari.
Endi switch ning natijasini o'zgaruvchi ichida saqlash mumkin.
Keling, yangi switch qanday ko'rinishda ekanligini ko'rib chiqamiz:
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;
};
Ko'zga birinchi tashlanadigan narsa - ixchamlik. Endi ko'p joyni egallaydigan kod bir necha satrlarda ifodalanadi va o'qilishi ancha ravon.
Oparator ->
Bundan tashqari, -> — arrow operator ga e'tibor bering. Agar sizda Lenda ifodalarini ishlatish tajribangiz bo'lsa, bu sizga tanish bo'lishi mumkin.
Endi siz switch ni La'mda uslubida yozishingiz mumkin va bu juda chiroyli ko'rinadi. Strelka (arrow oparatori) ishlatish kompilyatorni keyingi case ifodasiga o'tmasligini bildiradi (agar bu case blokda break yoki return bo'lmasa), va sizga strelkadagi o'ng tomondagi qiymatni qaytarib beradi.
Shuningdek, siz ifoda bo'lmagan va hech narsa qaytarmaydigan, lekin ma'lum amallarni bajaradigan kod ham yozishingiz mumkin:
switch(condition) {
case TRUE, FALSE -> System.out.println("True/false");
default -> System.out.println("Another");
}
E'tibor bering, endi switch break oparatorisiz. U Java 13 da olib tashlangan va yield so'zi bilan almashtirilgan.
Yield nima va uni qayerda ishlatish mumkin
Agar switch bitta qatorli ifodadan iborat bo'lsa, arrow -> o'z-o'zidan bu qiymatni qaytaradi. Lekin bir nechta satrli kod bo'lsa-chi? Arrow bunday holatlarda qiymatni qaytarmaydi, chunki satrlar bir nechta.
Return dan foydalanish kerak bo'lsa? U Java da qiymatlarni qaytarish uchun ishlatiladi. Lekin afsuski, return switch bilan ishlamaydi. Nima foydalanish kerak? Oldin break bo'lgan, lekin Java 13 da uni olib tashlashgan. Lekin yield — yangi kalit so'z, bu sizga switchning qiymatni qaytarishga yordam beradi, metodlar ichida return analogi.
var result = switch(condition) {
//…
case "Hi" -> "greeting"
//…
};
Bu kod bitta qatorli, va -> operator o'z-o'zidan "greeting" qiymatini qaytaradi.
Lekin bir nechta satrli kod bo'lganda:
var result = switch(condition) {
//…
case "Hi" -> {
// Kod
Bu yerda "greeting"ni qaytarish kerak
}
};
Aynan yield sizga qiymatni qaytarishga yordam beradi:
var result = switch(condition) {
//…
case "Hi" -> {
// Kod
yield "greeting";
}
};
yield Java 13 ga kiritilgan, case blokda bitta qator koddan ko'proq bo'lgan holatlarga natijani qaytarish uchun.
Sizga, albatta, yangi switch ni amalda sinab ko'rishni xohlaysiz, lekin esda tuting, sizga Java 14+ versiyalari kerak. Oldingi versiyalar bilan switch faqat “--enable-preview” bayrog'ini qo'yishda mavjud bo'ladi, chunki 14 versiyasigacha u preview rejimida bo'lgan va tilning to'liq qismi emas edi.
Shu bilan tamom, ko'rishguncha!
GO TO FULL VERSION