Wróć do bloga
Java

Java Switch Case | Kurs Java

Java Switch Case | Kurs Java

10 min czytania
Java Switch Case | Kurs Java

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.

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.

java
 
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.

java
 
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.

java
 
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.

switch case
switch case

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 case break
switch case break

java
 
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:

  1. number == 1
    Zostanie wyświetlony napis 'jeden' oraz 'dwa' i dopiero wtedy zakończy się wykonanie kodu na instrukcji break;
  2. number == 2
    Zostanie wyświetlony tylko napis 'dwa';
  3. 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.

java
 
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.

java
 
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.

java
 
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.

java
 
// 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.
java
 
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.

java
 
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ść.

java

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

Chcesz wdrożyć to u siebie?

Praktyczne kursy i wdrożenia AI oraz automatyzacji. Albo zapisz się na newsletter, żeby nie przegapić nowych treści.