Instrukcja switch w Javie od dawna wspiera String (od Java 7), a od nowszych wersji (Java 12–17) została rozbudowana o switch expressions i nową składnię ze strzałką ->. Poniżej znajdziesz kompletny poradnik poświęcony switch case dla String w Javie: składnia, przykłady, najczęstsze błędy i dobre praktyki.
- 1. Co to jest switch i po co używać go ze String?
- 2. Podstawowa składnia switch dla String
- 3. Pierwszy prosty przykład – komendy tekstowe
- 4. Jak Java porównuje String w switch?
- 5. Typy, które można stosować w switch (dla kontekstu)
- 6. Zbiorcze przypadki – kilka wartości w jednym bloku
- 7. Najczęstsze błędy przy switch na String
- 8. Nowa składnia: switch jako wyrażenie (Java 12+)
- 9. switch na String w kontekście aplikacji internetowych
- 10. Dobre praktyki przy switch na String (szczególnie w kodzie webowym)
- 11. Krok po kroku – mini-instrukcja dla początkujących
1. Co to jest switch i po co używać go ze String?
Instrukcja switch to konstrukcja wielokrotnego wyboru – alternatywa dla wielu if else if, która ułatwia wybór logiki na podstawie jednej wartości.
Dla typu String używamy jej najczęściej w następujących sytuacjach:
- obsługujemy komendy tekstowe (np. z konsoli, API, pliku),
- reagujemy na nazwy stanów (np.
"START","STOP","PAUSE"), - przetwarzamy typy zdarzeń (np.
"INFO","ERROR","WARN").
Od Java 7 switch może przyjmować String jako zmienną sterującą.
2. Podstawowa składnia switch dla String
Klasyczna postać instrukcji switch wygląda tak:
switch (wyrażenie) {
case "wartość1":
// kod dla wartości1
break;
case "wartość2":
// kod dla wartości2
break;
default:
// kod, jeśli nic nie pasuje
}
Najważniejsze elementy są następujące:
- Wyrażenie – tutaj może być zmienna lub wyrażenie typu
String(np.komenda,input.toUpperCase()); - case „wartość” – stała wartość, z którą porównywana jest wartość wyrażenia;
- break – kończy obsługę danego przypadku; bez niego program przejdzie do kolejnych case’ów (fall-through);
- default – wykonywany, gdy żaden
casenie pasuje; jest opcjonalny, ale bardzo zalecany.
3. Pierwszy prosty przykład – komendy tekstowe
Przykład użycia w praktyce:
public class SwitchStringDemo {
public static void main(String[] args) {
String command = "START";
switch (command) {
case "START":
System.out.println("Uruchamianie systemu...");
break;
case "STOP":
System.out.println("Zatrzymywanie systemu...");
break;
case "RESTART":
System.out.println("Restart systemu...");
break;
default:
System.out.println("Nieznana komenda: " + command);
}
}
}
Co tu się dzieje?
- zmienna sterująca
commandjest typuString, - Java porównuje ją z wartościami
"START","STOP","RESTART", - gdy trafi na pasujący
case, wykonuje jego kod i zatrzymuje się nabreak.
4. Jak Java porównuje String w switch?
Wewnątrz switch dla String kompilator generuje kod używający najpierw hashCode() łańcucha, a następnie equals() do ostatecznego potwierdzenia równości. Semantycznie zachowuje się to jak seria porównań:
if ("START".equals(command)) { ... }
else if ("STOP".equals(command)) { ... }
...
switch jest zwykle czytelniejszy przy wielu wariantach i bywa szybszy dzięki optymalizacji porównań.
5. Typy, które można stosować w switch (dla kontekstu)
Dla pełnego obrazu: w Javie switch działa tylko z kilkoma typami:
byte,short,char,inti ich klasy opakowujące (Byte,Short,Character,Integer),enum,String.
Typów zmiennoprzecinkowych (float, double) czy typów obiektowych innych niż String/enum nie można używać.
6. Zbiorcze przypadki – kilka wartości w jednym bloku
W klasycznej składni można świadomie wykorzystać fall-through, aby kilka wartości zachowywało się identycznie:
String role = "ADMIN";
switch (role) {
case "ADMIN":
case "SUPER_ADMIN":
System.out.println("Dostęp pełny");
break;
case "USER":
System.out.println("Dostęp standardowy");
break;
default:
System.out.println("Brak dostępu");
}
"ADMIN" i "SUPER_ADMIN" prowadzą do tego samego kodu, bo między przypadkami nie ma break.
7. Najczęstsze błędy przy switch na String
7.1. Brak break (niechciany fall-through)
Przykład kodu bez instrukcji break po pasującym przypadku:
switch (command) {
case "START":
System.out.println("Startuję");
case "STOP":
System.out.println("Stopuję");
default:
System.out.println("Domyślnie");
}
Jeśli command to "START", zobaczysz kolejno:
- „Startuję”,
- „Stopuję”,
- „Domyślnie”.
Dlaczego tak się dzieje? Ponieważ brak break powoduje, że wykonują się wszystkie kolejne bloki aż do napotkania break lub końca switch. Aby unikać błędu, świadomie dodawaj break albo przejdź na nową składnię ze strzałkami (Java 12+), gdzie domyślnie nie ma fall-through.
7.2. Porównywanie String o różnej wielkości liter
Przykład porównania czułego na wielkość liter:
String command = "start";
switch (command) {
case "START":
System.out.println("OK");
break;
default:
System.out.println("Nieznana komenda");
}
Wynik: „Nieznana komenda” – porównanie jest case-sensitive. Bezpieczniejsza wersja (z normalizacją):
String command = "start";
if (command != null) {
switch (command.toUpperCase()) {
case "START":
System.out.println("OK");
break; // inne case'y...
default:
System.out.println("Nieznana komenda");
}
} else {
System.out.println("Komenda nie może być nullem");
}
7.3. null w switch na String
Gdy zmienna sterująca jest null, dostaniesz NullPointerException:
String command = null;
switch (command) { // -> NullPointerException
case "START":
// ...
}
Najpierw sprawdź null lub nadaj wartość domyślną przed switch:
if (command == null) {
System.out.println("Brak komendy");
} else {
switch (command) {
case "START":
System.out.println("Start");
break;
default:
System.out.println("Nieznana komenda");
}
}
Alternatywnie, zdefiniuj domyślną wartość, np. command = command == null ? "UNKNOWN" : command;
7.4. Literówki i brak stałych
Każda wartość case musi być stałą (literalem lub stałą finalną). Literówki są częste i trudne do wychwycenia:
switch (command) {
case "STRAT": // literówka
// ...
}
Lepsza praktyka – użyj stałych:
public static final String CMD_START = "START";
switch (command) {
case CMD_START:
// ...
}
Stałe ograniczają ryzyko literówek i centralizują miejsce zmian.
7.5. Zbyt długi switch – brak refaktoryzacji
switch z dziesiątkami przypadków to sygnał do refaktoryzacji: przenieś logikę do osobnych metod lub rozważ wzorce Strategy/Command. W serwisach internetowych mapowanie String → akcja możesz zrealizować przez Map<String, Runnable> lub Map<String, Consumer<...>> zamiast rozrastającego się switch.
8. Nowa składnia: switch jako wyrażenie (Java 12+)
Od Java 12/14 wprowadzono switch expressions – switch może zwracać wartość i korzysta z wygodnej składni ->.
8.1. switch zwracający String
Przykład zwracania wartości z switch:
String status = "OK";
String message = switch (status) {
case "OK" -> "Wszystko w porządku";
case "ERROR" -> "Wystąpił błąd";
case "UNKNOWN" -> "Nieznany status";
default -> "Status nieobsługiwany";
};
System.out.println(message);
Cechy nowej składni:
switchjest wyrażeniem – możesz przypisać jego wynik do zmiennej,case "OK" -> "..."zwraca wartość; wiele instrukcji obsłużysz blokiem{}iyield,- brak
break– domyślnie nie ma fall-through.
8.2. Wiele instrukcji w jednym case (z yield)
Gdy w jednym przypadku potrzebujesz dodatkowej logiki, użyj bloku i yield:
String status = "ERROR";
String message = switch (status) {
case "OK" -> "OK";
case "ERROR" -> {
logError();
yield "Wystąpił błąd (zalogowano)";
}
default -> "Inny status";
};
yield zwraca wartość z danego bloku case wewnątrz switch expression.
8.3. Wiele wartości w jednym case (Java 14+)
Możesz łączyć kilka wartości w jednym przypadku:
String method = "POST";
String action = switch (method) {
case "GET", "HEAD" -> "Pobieranie danych";
case "POST", "PUT" -> "Modyfikacja danych";
case "DELETE" -> "Usuwanie danych";
default -> "Metoda HTTP nieobsługiwana";
};
To czytelny odpowiednik prostego routera metod HTTP w kodzie backendowym.
9. switch na String w kontekście aplikacji internetowych
W aplikacjach webowych (serwery HTTP, REST API, serwlety) String w switch pojawia się bardzo często.
9.1. Routing po ścieżkach/akcjach
Przykład prostego „routera” w serwlecie:
String action = request.getParameter("action");
if (action == null) {
action = "HOME";
}
switch (action) {
case "HOME":
showHomePage(request, response);
break;
case "LOGIN":
showLoginPage(request, response);
break;
case "LOGOUT":
performLogout(request, response);
break;
default:
showNotFoundPage(request, response);
}
Komentarze do powyższego rozwiązania:
- wszystkie akcje sterowane są jednym parametrem tekstowym,
switchzapewnia czytelne przypisanie akcji do metody,defaultmoże obsłużyć błędne/nieznane akcje – np. przekierowanie na 404.
9.2. Obsługa metod HTTP
Przykład klasycznej i nowej składni dla metod HTTP:
String method = request.getMethod(); // np. "GET", "POST"
switch (method) {
case "GET":
handleGet(request, response);
break;
case "POST":
handlePost(request, response);
break;
default:
response.sendError(405); // Method Not Allowed
}
Wersja ze switch expression:
String result = switch (request.getMethod()) {
case "GET" -> handleGet(request);
case "POST" -> handlePost(request);
default -> "Metoda nieobsługiwana";
};
9.3. Mapowanie typów zdarzeń / logów
Przykład klasycznego podejścia:
String level = "WARN";
switch (level) {
case "INFO":
logInfo(message);
break;
case "WARN":
logWarning(message);
break;
case "ERROR":
logError(message);
break;
default:
logDebug(message);
}
Oraz wersja zwracająca wartość:
LogLevel logLevel = switch (level) {
case "INFO" -> LogLevel.INFO;
case "WARN" -> LogLevel.WARNING;
case "ERROR" -> LogLevel.ERROR;
default -> LogLevel.DEBUG;
};
10. Dobre praktyki przy switch na String (szczególnie w kodzie webowym)
- Normalizuj dane wejściowe
Ustal standard (np. wszystkie komendy wielkimi literami) i stosuj
toUpperCase()/toLowerCase(); to ułatwia współpracę z zewnętrznymi systemami, które mogą różnie zapisywać komendy. - Zawsze obsługuj
defaultSzczególnie w aplikacjach internetowych to miejsce na:
- zwrócenie kodu HTTP 400 / 404 / 405,
- logowanie nieznanej komendy/metody,
- czytelny komunikat dla użytkownika.
- Chroń się przed
nullNie zakładaj, że klienci HTTP czy formularze zawsze wyślą poprawne parametry; prosty warunek
if (value == null)przedswitcheliminujeNullPointerException. - Unikaj wielkich, monolitycznych
switchGdy liczba przypadków rośnie, przenieś logikę do osobnych metod (np.
handleHome,handleLogin) lub rozważ mapęMap<String, Runnable>/Map<String, Command>. - Stosuj stałe zamiast stringów „z palca”
Definicja stałej:
public static final String ACTION_HOME = "HOME";
Użycie w switch:
switch (action) {
case ACTION_HOME:
// ...
}
Zalety stosowania stałych:
- łatwiejsza refaktoryzacja,
- autouzupełnianie w IDE,
- mniejsze ryzyko literówek.
- W nowych projektach preferuj nową składnię
switch(Java 14+)- brak
break⇒ mniej błędów, - możliwość zwracania wartości ⇒ bardziej ekspresyjny kod,
- łączenie wielu wartości w jednym
case⇒ mniej powtórzeń.
- brak
11. Krok po kroku – mini-instrukcja dla początkujących
Krok 1 – pobierz komendę od użytkownika:
Scanner scanner = new Scanner(System.in);
System.out.print("Podaj komendę (START/STOP/HELP): ");
String command = scanner.nextLine();
Krok 2 – znormalizuj komendę:
if (command != null) {
command = command.trim().toUpperCase();
}
Krok 3 – zastosuj switch na String:
if (command == null || command.isEmpty()) {
System.out.println("Nie podano komendy.");
} else {
switch (command) {
case "START":
System.out.println("System zostaje uruchomiony.");
break;
case "STOP":
System.out.println("System zostaje zatrzymany.");
break;
case "HELP":
System.out.println("Dostępne komendy: START, STOP, HELP");
break;
default:
System.out.println("Nieznana komenda: " + command);
}
}
Krok 4 – rozszerz przykład o logikę internetową. Zamiast Scanner użyj jednego z poniższych źródeł:
- parametrów
request.getParameter("action")w serwlecie, - danych z JSON w REST API,
- innych źródeł wejścia (np. nagłówków lub ścieżki URL).
Sam switch pozostaje bez zmian – modyfikuje się jedynie źródło wartości String.








