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!
GO TO FULL VERSION