Когато пишете code с много условия, със сигурност сте използвали оператор if-else or switch . Но тази алтернатива на if-else има недостатъци. Някои хора дори нарекоха изявлението за превключване "анти-модел".
Какво е това? Анти-моделът е често срещан модел на лош code, т.е. лошо решение на проблем. Програмистите се опитват да ги избегнат в codeа, тъй като влошават качеството на codeа. |
Но има добра новина: новите версии на Java донесоха много промени в синтаксиса на езика и една от тези промени засяга switch . Заинтригуван? Тогава да се потопим.
Като начало си струва да изясним защо switch е анти-модел. Разгледайте следния code:
switch (condition) {
case "DECEMBER":
seasonNumber = 1;
break;
case "JANUARY":
seasonNumber = 1;
break;
case "FEBRUARY":
seasonNumber = 1;
break;
default:
seasonNumber = 0;
}
Добре, така че все още не е напълно ясно защо това е "анти-модел".
Но Howво ще стане, ако добавим още блокове case и сега codeът изглежда така:
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;
}
Нека добавим още няколко реда - codeът става по-дълъг. По-късно можем да добавяме още и още редове и никой няма да ни попречи да го направим.
Това е сърцевината на проблема: след първоначалното създаване на компактен оператор за превключване , ние добавяме все повече и повече code към него, заемайки все повече и повече място - повече, отколкото ще се побере на екрана - и прави codeа неудобен за четене и поддръжка.
Разлика между оператора switch и израза switch
Java 14 представи нов и подобрен превключвател. Това не е оператор switch , а по-скоро израз switch .
Каква е разликата, ще попитате? Разликата е, че операторът е инструкция, която изпълнява определен набор от операции, но изразът е част от code, който извършва няHowво изчисление и връща резултат.
С други думи, сега можете да запазите резултата от превключване към променлива.
Стига приказки. Сега нека видим How изглежда новият превключвател :
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;
};
Първото нещо, което хваща окото ви е колко компактен е codeът. Кодът, който преди заемаше по-голямата част от екрана, сега обхваща няколко реда и изглежда много по-четлив.
-> оператор
Трябва също да обърнете внимание на оператора -> (оператор със стрелка). Може вече да сте запознати с него, ако имате опит с ламбда изрази.
Това означава, че сега можете да напишете страхотно изглеждащ ключ в стила на ламбда израз. Операторът със стрелка показва, че компилаторът няма да продължи към следващия case израз (ако в текущия case блок липсва оператор break or return ), а instead of това ще ви даде стойността на израза вдясно от стрелката.
Можете също да напишете code, който не е израз и просто изпълнява определени действия, instead of да връща нещо:
switch(condition) {
case TRUE, FALSE -> System.out.println("True/false");
default -> System.out.println("Another");
}
Обърнете внимание, че превключвателят вече няма израз за прекъсване . Той беше премахнат в Java 13 и заменен с yield .
Какво е добив и къде може да се използва?
Когато ключът се състои от един ред, самият оператор -> връща стойността. Но Howво ще стане, ако имаме не един, а много редове code? В такива случаи операторът със стрелка няма да върне стойност, тъй като има няколко реда, а не един.
Може би можем да използваме return ? В крайна сметка се използва за връщане на стойности в Java. Уви, не, връщането няма да работи с превключвател. И така, Howво можем да използваме? Преди имаше break , но това беше премахнато в Java 13. Но на негово място сега имаме yield — нова ключова дума, която ви помага да върнете стойност от превключвател. Аналогично е на операторите за връщане в методите.
var result = switch(condition) {
//…
case "Hi" -> "greeting"
//…
};
Този code съдържа един ред и операторът -> ще върне "поздрав".
Но когато имаме блок от code:
var result = switch(condition) {
//…
case "Hi" -> {
// Your code
Here you need to return "greeting"
}
};
Ключовата дума, която ще ви помогне да върнете стойност, е yield :
var result = switch(condition) {
//…
case "Hi" -> {
// Your code
yield "greeting";
}
};
yield беше добавен в Java 13 за случаите, когато имаме повече от един ред code в блок case и трябва да върнем резултат.
Вероятно сте нетърпеливи да изпробвате новия превключвател във вашия code, но не забравяйте, че имате нужда от Java 14 or по-висока, за да направите това. При по-ранните версии този превключвател ще бъде наличен само ако посочите флага „--enable-preview“ на командния ред, тъй като преди version 14 той беше част от техническия преглед, а не пълноценна част от езика.
Това е всичко за сега! Ще се видим!
GO TO FULL VERSION