Spis treści
- Rozdział 4 - Instrukcje warunkowe
- Podstawy instrukcji warunkowych
- Operatory relacyjne
- Typ boolean
- Warunki instrukcji if
- Operatory warunkowe i operator logiczny !
- Tablica prawdy operatorów warunkowych
- Nawiasy i priorytety operatorów warunkowych
- Short-circuit evaluation
- Zagnieżdżanie instrukcji warunkowych
- Bloki kodu i zakresy zmiennych
- Instrukcja switch
- Trój-argumentowy operator logiczny
- Podsumowanie
- Pytania
- Zadania
Poza instrukcją if, mamy do dyspozycji jeszcze inny rodzaj instrukcji warunkowej – jest to instrukcja switch. Jej składnia jest następująca:
switch (zmienna) { case staleWyrazenie: instrukcja; break; case staleWyrazenie2: instrukcja2; break; default: instrukcja3; }
Instrukcja switch ma za zadanie przyrównanie wartość zmiennej zmienna do podanych stałych wartości – jeżeli wartość będzie pasować do którejś z porównywanych wartości, to wykonane zostaną instrukcje z nią powiązane. Zwróćmy uwagę, że instrukcje powiązane z daną sekcją case nie są objęte w klamry { }.
Jeżeli natomiast żadna z wartości nie będzie pasować, wykonane zostaną instrukcje z bloku default, który nie jest konieczny w instrukcji switch – można go pominąć.
Spójrzmy na przykład użycia instrukcji switch:
import java.util.Scanner; public class InstrukcjaSwitchDzienTygodnia { public static void main(String[] args) { int dzienTygodnia; System.out.println("Podaj dzien tygodnia:"); dzienTygodnia = getInt(); switch (dzienTygodnia) { case 1: System.out.println("Poniedzialek."); break; case 2: System.out.println("Wtorek."); break; case 3: System.out.println("Sroda."); break; case 4: System.out.println("Czwartek."); break; case 5: System.out.println("Piatek."); break; case 6: System.out.println("Sobota."); break; case 7: System.out.println("Niedziela."); break; default: System.out.println("Nieznany dzien tygodnia!"); } } public static int getInt() { return new Scanner(System.in).nextInt(); } }
W powyższym przykładzie pobieramy od użytkownika numer dnia tygodnia i wypisujemy jego nazwę przy użyciu instrukcji switch – porównujemy wartość zmiennej dzienTygodnia do liczb w kolejnych sekcjach case. Jeżeli żadna z wyszczególnionych liczb nie będzie zgadzała się z wartością zmiennej dzienTygodnia, wypisany zostanie komunikat z sekcji default.
Spójrzmy na dwa przykładowe wykonania powyższego programu:
Instrukcji switch można używać tylko z kilkoma typami, którymi są:
- byte i Byte
- short i Short
- char i Character
- int i Integer
- String
- enum
O typach Byte, Short, enum i pozostałych porozmawiamy w jednym z kolejnych rozdziałów.
Użycie break w instrukcji switch¶
Zadaniem słowa kluczowego break jest przerwanie wykonania kolejnych, następujących po nim operacji.
Wracając do przykładu programu z dniem tygodnia – jeżeli usunęlibyśmy słowa kluczowe break, a podalibyśmy z klawiatury np. dzień o numerze 3, to po wypisaniu na ekran informacji "Sroda" wypisane zostałyby kolejne linie z komunikatami "Czwartek", "Piatek" itd., łącznie z komunikatem wypisywanym pod sekcją default. Spójrzmy na poprzedni przykład bez instrukcji break:
import java.util.Scanner; public class InstrukcjaSwitchDzienTygodniaBezBreak { public static void main(String[] args) { int dzienTygodnia; System.out.println("Podaj dzien tygoddnia:"); dzienTygodnia = getInt(); switch (dzienTygodnia) { case 1: System.out.println("Poniedzialek."); case 2: System.out.println("Wtorek."); case 3: System.out.println("Sroda."); case 4: System.out.println("Czwartek."); case 5: System.out.println("Piatek."); case 6: System.out.println("Sobota."); case 7: System.out.println("Niedziela."); default: System.out.println("Nieznany dzien tygodnia!"); } } public static int getInt() { return new Scanner(System.in).nextInt(); } }
Spójrzmy jak zachowa się ta wersja programu na kilku przykładach:
Brak słowa kluczowego break powoduje, że po dopasowaniu wartości zmiennej dzienTygodnia do wartości z jednej z sekcji case, wykonywane są nie tylko powiązane z nią instrukcje, ale także instrukcje wszystkich sekcji case po niej następujące.
Użycie break nie jest wymagane, ale zazwyczaj jego brak świadczy o tym, że programista zapomniał go po prostu dopisać. Czasami opisane działanie instrukcji switch jest przydatne, ale niekiedy powoduje też trudne do wychwycenia błędy.
Od wersji Java 12 instrukcja switch ma nową wersję, która nie wymaga już używania "break". Zamiast ":" stosujemy "->". Taki zapis powoduje, że switch nie kontynuuje działania po spełnieniu pierwszego poprawnego "case".
Kod jest czytelniejszy.
Nie do końca - wspomniany mechanizm, jako funkcjonalność standardowa, jest w Javie dopiero od niedawna, bo od wersji 14. W wersji Java 12 i 13 funkcjonalność ta nie było dostępna "od ręki", a jedynie jako funkcjonalność "preview". Mechanizm "Wyrażeń switch" (jak i różnice między funkcjonalnościami "standardowymi" i "preview") dokładniej opisuję w artykule:
https://kursjava.com/nowosci-w-java-14/#wyrazeniaSwitch.