Когато пишете 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 той беше част от техническия преглед, а не пълноценна част от езика.

Това е всичко за сега! Ще се видим!