Java switch case dla String – składnia, przykłady i najczęstsze błędy

Oskar Gajzler
Przez
Oskar Gajzler
Redaktor IINTE.edu.pl, na co dzień zajmuje się technologiami internetowymi i tłumaczeniem skomplikowanych tematów na prosty język. Pisze poradniki o tym, jak załatwiać sprawy przez internet, jak...
12 min czytania

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?

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 case nie 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 command jest typu String,
  • Java porównuje ją z wartościami "START", "STOP", "RESTART",
  • gdy trafi na pasujący case, wykonuje jego kod i zatrzymuje się na break.

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, int i 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 expressionsswitch 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:

  • switch jest wyrażeniem – możesz przypisać jego wynik do zmiennej,
  • case "OK" -> "..." zwraca wartość; wiele instrukcji obsłużysz blokiem {} i yield,
  • 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,
  • switch zapewnia czytelne przypisanie akcji do metody,
  • default moż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)

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

  2. Zawsze obsługuj default

    Szczególnie w aplikacjach internetowych to miejsce na:

    • zwrócenie kodu HTTP 400 / 404 / 405,
    • logowanie nieznanej komendy/metody,
    • czytelny komunikat dla użytkownika.
  3. Chroń się przed null

    Nie zakładaj, że klienci HTTP czy formularze zawsze wyślą poprawne parametry; prosty warunek if (value == null) przed switch eliminuje NullPointerException.

  4. Unikaj wielkich, monolitycznych switch

    Gdy liczba przypadków rośnie, przenieś logikę do osobnych metod (np. handleHome, handleLogin) lub rozważ mapę Map<String, Runnable>/Map<String, Command>.

  5. 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.
  6. 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ń.

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.

Udostępnij ten artykuł
Obserwuj
Redaktor IINTE.edu.pl, na co dzień zajmuje się technologiami internetowymi i tłumaczeniem skomplikowanych tematów na prosty język. Pisze poradniki o tym, jak załatwiać sprawy przez internet, jak bezpiecznie korzystać z sieci i jak dobierać sprzęt oraz oprogramowanie. Prywatnie tropi nowinki technologiczne i testuje je, zanim opisze.
Brak komentarzy

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Wymagane pola są oznaczone *