Z pewnością używałeś if-else lub switch w kodzie z wieloma warunkami . Ale ta alternatywa ma wady w jej użyciu: ludzie nazywali nawet przełącznik „antywzorcem”.

Co to jest? Antywzorzec to wzorzec złego kodu, złe rozwiązanie problemu. W programowaniu starają się unikać używania ich w kodzie, ponieważ obniżają one jakość kodu.

Ale jest dobra wiadomość: wraz z wydaniem nowych wersji Javy wiele zmieniło się w składni języka, a jedna ze zmian dotknęła właśnie switch . Ciekawy? Więc chodźmy się dowiedzieć.

Na początek warto wyjaśnić, dlaczego switch jest antywzorcem. Rozważ następujący kod:


switch (condition) {
    case "DECEMBER":
        seasonNumber = 1;
        break;
    case "JANUARY":
        seasonNumber = 1;
        break;
    case "FEBRUARY":
        seasonNumber = 1;
        break;
    default:
        seasonNumber = 0;
}

Do tej pory nie do końca jest jasne, dlaczego jest to „antywzorzec”, to prawda.

Ale co jeśli dodamy więcej bloków przypadków i kod będzie wyglądał tak:


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;
}

Dodajmy jeszcze kilka linii, a kod stanie się dłuższy. A potem możesz dodawać coraz więcej linii i nikt nas przed tym nie powstrzyma.

To jest główny problem: początkowo stworzyliśmy mały i kompaktowy przełącznik , a następnie dodajemy do niego coraz więcej kodu, co w rezultacie zajmuje coraz więcej miejsca niż mamy na ekranie i staje się niewygodne w czytaniu i utrzymaniu.

Różnica między instrukcją switch a wyrażeniem switch

W Javie 14 wyszedł nowy przełącznik, poprawiony. Teraz nie jest to już instrukcja switch , ale wyrażenie switch .

Jaka jest różnica, pytasz? Fakt, że instrukcja jest instrukcją w kodzie, która wykonuje określony zestaw operacji, a wyrażenie jest fragmentem kodu, który wykonuje pewne obliczenia i zwraca wynik.

Oznacza to, że teraz możesz zapisać wynik przełączenia do zmiennej.

Zobaczmy wreszcie, jak wygląda nowy przełącznik :


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; 
};

Pierwszą rzeczą, która rzuca się w oczy, jest zwartość. Teraz kod, który zajmował większość ekranu, obejmuje kilka wierszy i wygląda o wiele bardziej czytelnie.

Operator ->

Warto również zwrócić uwagę na operator -> - operator strzałki. Może być ci znany, jeśli masz doświadczenie z wyrażeniami lambda.

Więc teraz możesz napisać przełącznik w stylu lambda i wygląda fajnie. Użycie strzałki (operatora strzałki) mówi, że teraz kompilator nie przejdzie do następnego wyrażenia case (jeśli nie mamy w tym przypadku bloku break lub return ), ale zwróci ci wartość, która będzie po prawej stronie strzałki.

Możesz także napisać kod, który nie jest wyrażeniem i niczego nie zwróci, ale po prostu wykona określone czynności:


switch(condition) {
    case TRUE, FALSE -> System.out.println("True/false");
  
    default -> System.out.println("Another");
}

Zauważ, że przełącznik nie ma teraz instrukcji break . Został usunięty w Javie 13 i zastąpiony słowem yield .

Czym jest plon i gdzie można go wykorzystać

Gdy przełącznik składa się z jednej linii, sama strzałka -> zwróci tę wartość. Ale co jeśli mamy nie jedną, a kilka linii kodu? Strzałka w takich przypadkach nie zwróci wartości, ponieważ nie ma jednego, ale kilka wierszy.

Może użyj zwrotu ? Jest używany w Javie do zwracania wartości. Ale niestety nie: powrót nie działa z przełącznikiem. Czego więc użyć? Kiedyś był break , ale Java 13 go usunął. Pojawiło się jednak yield - nowe słowo kluczowe, które pomoże Ci zwrócić wartość z przełącznika, analogicznie do zwrotu w metodach.


var result = switch(condition) {
//…
case "Hi" -> "greeting"
//…
};  

Ten kod zawiera jedną linię, a operator -> zwróci Ci wartość „pozdrowienia”.

Ale w przypadkach, gdy mamy blok kodu:


var result = switch(condition) {
//…
case "Hi" -> {
// Your code
 Here you need to return "greeting"
	}
};  

To wydajność pomoże ci zwrócić wartość :


var result = switch(condition) {
//…
case "Hi" -> {
// Your code
 yield "greeting";

	}
};

yield został dodany w Javie 13, gdy mamy więcej niż jedną linię kodu w bloku case i musimy zwrócić wynik.

Prawdopodobnie już chcesz wypróbować nowy przełącznik w praktyce , ale pamiętaj, że potrzebujesz do tego wersji Java 14+. We wcześniejszych wersjach przełącznik będzie dostępny tylko wtedy, gdy podczas uruchamiania określisz flagę „--enable-preview”, ponieważ przed wersją 14 był on w trybie podglądu i nie był pełną częścią wersji językowej.

To wszystko, do zobaczenia!