Switch case – Każdego dnia dokonujemy wyborów, które są podyktowane określonymi warunkami. Wyobraź sobie poranną sytuację, kiedy chcesz zrobić sobie śniadanie. Opcji masz naprawdę sporo: omlet, kanapka 🥖, jajecznica 🍳, tost itd. Najpierw jednak sprawdzasz, co tak naprawdę masz w lodówce – i to pomaga podjąć Ci ostateczną decyzję. Przy wielokrotnych wyborach w Javie warto sięgnąć po instrukcję switch case, ponieważ idealnie się do tego nadaje.
W tym materiale porozmawiamy o jednym z typów instrukcji warunkowych – switch case. Przedstawię Ci strukturę tej konstrukcji oraz dowiesz się jakie argumenty ona przyjmuje.
Spis treści
- 1 Java – Switch case – wprowadzenie
- 2 Java – Switch case
- 3 Java – If else
- 4 Java Switch Case – Podstawowa struktura
- 5 Java Switch Case – Warianty Case
- 6 Java Switch Case Default – Wartość domyślna
- 7 Java Switch Case – Instrukcja break
- 8 Java Switch Case – Argument wejściowy
- 9 Java – Klasy osłonowe
- 10 Java – Typy proste
- 11 Java – Enum
- 12 Java – String
- 13 Java – Switch vs If else
- 14 Java – Switch Expression
- 15 Java – Switch Expression – yield
- 16 Java – Switch case – podsumowanie
- 17 Kierunek Java
- 18 20+ BONUSOWYCH materiałów z programowania
Java – Switch case – wprowadzenie
Z tego materiału dowiesz się:
- Czym jest switch case?
- Czym jest wartość domyślna w switch case?
- Jak działa break w switch case?
- Jakie argumenty przyjmuje switch case?
- Co jest lepsze switch case czy if else?
Java – Switch case
Switch case to instrukcja wielokrotnego wyboru, dzięki której można warunkowo wykonać pewne fragmenty kodu.
Jest to swego rodzaju rozszerzenie instrukcji if else. Jednak od pierwowzoru różni się przede wszystkim typem przyjmowanych argumentów wejściowych, możliwością wykonania kilku bloków kodu i samą czytelnością zapisu.
Java – If else
W ramach tego materiału zajęliśmy się przede wszystkim instrukcją switch case – natomiast jeżeli chcesz poznać bliżej temat instrukcji if else zachęcam Cię do zapoznania się z poniższych materiałem:
➡ ZOBACZ 👉: Instrukcja warunkowa IF ELSE
Java Switch Case – Podstawowa struktura
Switch nie jest typową instrukcją warunkową, a raczej swego rodzaju przełącznikiem. Przy jego pomocy można „przełączyć” wykonywanie kodu aplikacji na różne tory w zależności od zaistniałej sytuacji.
int number = 1; switch (number) { case 1: System.out.println("jeden"); }
Przykład powyżej prezentuje możliwie prostą konstrukcję Switch z jednym warunkiem Case. Jeżeli argument wejściowy będzie równy jeden (1), zostanie wyświetlony napis „jeden”. W przeciwnym wypadku cały blok switch zostanie pominięty.
Java Switch Case – Warianty Case
W instrukcji Switch, w przeciwieństwie do If Else, nie określamy warunków, które muszą być spełnione, aby dany kod został wykonany. W przypadku tej instrukcji określamy wyrażenie wejściowe oraz warianty (ang. cases) kodu, które mają być wykonane w zależności od jego wartości. Poszczególne warianty oznaczamy słowem kluczowym case, po którym następuje wartość obsługiwanego argumentu wejściowego i fragment przypisanego kodu do wykonania.
Ilość poszczególnych warunków Case jest dowolna.
int number = 1; switch (number) { } switch (number) { case 1: System.out.println("jeden"); case 2: System.out.println("dwa"); }
Java Switch Case Default – Wartość domyślna
Instrukcja Switch daje również możliwość określenia opcjonalnego wariantu domyślnego, który zostanie wywołany, jeżeli argument wejściowy nie zostanie dopasowany do żadnego warunku case.
switch (number) { case 1: { System.out.println("jeden"); } default: { System.out.println("default"); } }
Wariant domyślny określamy słowem kluczowym default. Zazwyczaj taki warunek umieszcza się na samym końcu instrukcji switch, jednak nie jest to konieczne.
Java Switch Case – Instrukcja break
Poszczególne warianty case nie muszą być całkowicie niezależnymi fragmentami kodu i wcale nie muszą się wykluczać. Powinny być raczej rozumiane jako początkowe punkty wejścia do instrukcji switch.
Jeżeli aplikacja wejdzie do jakiegoś warunku case, to będzie wykonywała kaskadowo wszystkie kolejne bloki kodu.
Wykonywanie kolejnych bloków kończy się dopiero instrukcją break lub końcem całej instrukcji switch.
To właśnie dlatego kolejność poszczególnych bloków oraz odpowiednie umieszczenie instrukcji break ma zasadnicze znaczenie.
switch (number) { case 1: System.out.println("jeden"); case 2: System.out.println("dwa"); break; default: { System.out.println("default"); } }
Powyższy przykład możemy rozbić na 3 sytuacje wg wartości zmiennej number:
- number == 1
Zostanie wyświetlony napis ’jeden’ oraz ’dwa’ i dopiero wtedy zakończy się wykonanie kodu na instrukcji break; - number == 2
Zostanie wyświetlony tylko napis ’dwa’; - W każdym innym wypadku zostanie wyświetlony napis ’default’;
Java Switch Case – Argument wejściowy
Java wymaga, aby wartości porównywane do zmiennej wejściowej (warunki case) były znane już podczas kompilacji.
W praktyce oznacza to, że nie mogą tam pojawić się:
- zmienne,
- metody zwracające wartość.
Porównywana zmienna musi być typu:
- byte,
- short,
- char,
- int,
- Enum,
- String,
- jednym z klas osłonowych : Character, Byte, Short, Integer.
⚠️ Pamiętaj, że wartości null nie można przekazać jako argumentu do instrukcji switch. Jeżeli to zrobimy otrzymamy NullPointerException ⚠️
Java – Klasy osłonowe
W ramach tego materiału zajęliśmy się przede wszystkim instrukcją switch case – natomiast jeżeli chcesz poznać bliżej temat klas osłonowych, to zachęcam Cię do zapoznania się z poniższych materiałem:
➡ ZOBACZ 👉: Klasy osłonowe / opakowujące
Switch case – Argumenty wejściowe – Wartości numeryczne
Jako wartości numeryczne rozumiany jest int oraz typy proste, które mogą być na niego zamienione: byte, short, char i ich klasy osłonowe.
byte number = 1; switch (number) { case 1: System.out.println("jeden"); }
Java – Typy proste
W ramach tego materiału zajęliśmy się przede wszystkim instrukcją switch case – natomiast jeżeli chcesz poznać bliżej temat typów prostych, to zachęcam Cię do zapoznania się z poniższych materiałem:
➡ ZOBACZ 👉: Typy proste
Switch case – Argumenty wejściowe – Typ wyliczeniowy enum
Wyrażenie switch w Javie bardzo dobrze współgra z typem wyliczeniowym enum.
enum Type { A, B, C } Type type = Type.A; switch (type) { case A: break; case B: break; case C: break; default: }
Jeżeli porównywana zmienna będzie pusta, otrzymamy wyjątek: java.lang.NullPointerException.
Java – Enum
W ramach tego materiału zajęliśmy się przede wszystkim instrukcją switch case – natomiast jeżeli chcesz poznać bliżej temat typu wyliczeniowego Enum, to zachęcam Cię do zapoznania się z poniższych materiałem:
➡ ZOBACZ 👉: Java Enum
Switch case – Argumenty wejściowe – String
Java od wersji 7 dopuszcza również ciągi znaków (klasa String) jako argument wejściowy dla switch.
String v = "a"; switch (v) { case "a": case "b": case "c": break; }
Java – String
W ramach tego materiału zajęliśmy się przede wszystkim instrukcją switch case – natomiast jeżeli chcesz poznać bliżej temat String’a, to zachęcam Cię do zapoznania się z poniższych materiałem:
➡ ZOBACZ 👉: String – najważniejszy typ danych
Java – Switch vs If else
Kiedy wykorzystać Switch, a kiedy instrukcję If Else?
Nie ma jasno zdefiniowanych reguł o tym decydujących. Te dwie instrukcje są praktycznie wymienne i to czytelność kodu powinna zadecydować, z której z nich w danym momencie skorzystać.
Zazwyczaj dla prostych porównań lepiej sprawdza się instrukcja if, a dla bardziej rozbudowanych switch. W takich wypadkach nawet IDE podpowiada, by zamienić jedną konstrukcję na drugą.
Switch bardzo dobrze sprawdza się też w przypadku zmiennych typu enum.
// 1 if (number == 1) { } else if (number == 2) { } else if (number == 3) { } else if (number == 4) { } else if (number == 5) { } else { } // 2 switch (number) { case 1: break; case 2: break; case 3: break; case 4: break; case 5: break; default: break; }
Jeżeli jednak ilość warunków dalej się rozrasta, warto pomyśleć o przebudowaniu kodu, ponieważ przy dużej ilości warunków, niezależnie czy będzie to switch, czy if, kod będzie zwyczajnie nieczytelny.
Java – Switch Expression
Z każdą kolejną wersją Javy pojawiają się różne ulepszenia. Switch case również doczekał się tuningu i tak od wersji JDK 12 (potem jeszcze ulepszonego w JDK 13) dostępny jest tzw. switch expression.
Co wprowadza switch expression?💡
- operator -> zamiast dwukropka,
- brak słowa kluczowego break (wyrażenie switch nie przechodzi przez przypadki),
- możliwość większej ilości przypadków w jednym case – przypadki odgraniczone są wtedy przecinkami,
- możliwość przypisania wyniku switch’a do zmiennej.
String season = switch (month) { case APRIL, MAY, JUNE -> "Spring"; case JULY, AUGUST, SEPTEMBER -> "Summer"; case OCTOBER, NOVEMBER, DECEMBER -> "Autumn"; case JANUARY, FEBRUARY, MARCH -> "Winter"; default -> "Not a season"; };
Switch expression jest przyjemnym odświeżeniem konstrukcji switch. Jednak nie stoi na przeszkodzie używania ciągle klasycznej wersji switch case. Przy bardziej rozbudowanych przypadkach, switch expression nadaje większej czytelności i zdecydowanie zmniejsza ilość linii kodu w porównaniu do zastosowania klasycznego switch’a.
String season1; switch (month) { case APRIL: case MAY: case JUNE: season1 = "Spring"; break; case JULY: case AUGUST: case SEPTEMBER: season1 = "Summer"; break; case OCTOBER: case NOVEMBER: case DECEMBER: season1 = "Autumn"; break; case JANUARY: case FEBRUARY: case MARCH: season1 = "Winter"; break; default: season1 = "Not a season"; };
Java – Switch Expression – yield
Od JDK 14 pojawia się słowo kluczowe yield. Jest to słowo, które można powiedzieć, że jest połączeniem break i return. Yield przerywa wykonywanie switch’a, jednocześnie zwracając wartość.
Yield jest również przydatny w sytuacji, w której po wejściu do danego warunku chcemy wykonać bardziej złożony blok kodu, w którym na końcu chcemy zwrócić wartość.
String season = switch (month) { case APRIL, MAY, JUNE -> "Spring"; case JULY, AUGUST, SEPTEMBER -> "Summer"; case OCTOBER, NOVEMBER, DECEMBER -> "Autumn"; case JANUARY, FEBRUARY, MARCH -> { String nameOfMonth = month.name(); yield nameOfMonth + " is the Winter month"; } default -> "Not a season"; };
Java – Switch case – podsumowanie
W ramach tego materiału dowiedzieliśmy się, czym jest instrukcja warunkowa switch case. Bliżej poznaliśmy konstrukcję tej instrukcji warunkowej i typy argumentów jakie przyjmuje. Jeżeli chcesz kontynuować swoją przygodę z Javą i poznać inne struktury, które oferuję ten język programowania – to zapraszam do kolejnego tematu z serii o Javie. Przedstawię Ci typ wyliczeniowy – enum.
➡ ZOBACZ 👉: Java enum
Kierunek Java
W serii o Javie zapoznajesz się z podstawowymi tematami o Javie. Jeżeli chcesz bardziej kompleksowo zagłębić się w temat Javy, poczytać, posłuchać o Javie, to zachęcam Cię do zapoznania się z moim kursem „Kierunek Java”:
➡ ZOBACZ 👉: Kierunek Java
20+ BONUSOWYCH materiałów z programowania
e-book – „8 rzeczy, które musisz wiedzieć, żeby dostać pracę jako programista”,
e-book – „Java Cheat Sheet”,
checklista – „Pytania rekrutacyjne”
i wiele, wiele wiecej!
2 Comments
Bardzo dobrze wytłumaczone. Dziękuję!
Dzięki Aniu. Polecam się 🙂