Geschiedenis van de vraag:
Tot Java 12 werd de switch-operator uitsluitend als statement gebruikt. Met de release van Java 12/14 zijn switch-expressies (switch expression) geïntroduceerd, die de syntaxis en mogelijkheden van de operator hebben uitgebreid. Switch-expressies zijn bedoeld voor een beknoptere en expressievere code.
Probleem:
De klassieke switch leidt vaak tot fouten: een vergeten break leidt tot fall-through, leesbaarheid bij meerdere cases, de onmogelijkheid om rechtstreeks een resultaat in een expressie terug te geven, en het ontbreken van uitgebreide waarde-controle.
Oplossing:
Een switch-expressie kan een waarde retourneren, gebruik maken van pijl-syntaxis, ondersteuning bieden voor uitgebreide analyse tijdens compilatie en null verwerken via default. De syntaxis is:
String result = switch(day) { case MONDAY, FRIDAY -> "Werkdag"; case SATURDAY, SUNDAY -> "Weekend"; default -> throw new IllegalArgumentException(); };
Belangrijke kenmerken:
Kan switch werken met enums, strings en null?
Werkt met enums vanaf Java 5. Met strings vanaf Java 7. Null wordt alleen via default verwerkt, anders krijg je een NPE.
switch(day) { // day == null default: System.out.println("null"); } // werkt
Wat gebeurt er als niet alle varianties van enum worden geïmplementeerd in een switch-expressie?
De compiler vereist default of implementatie voor alle waarden. Bij afwezigheid hiervan zal er een compileerfout optreden.
Kan ik break gebruiken in de nieuwe switch-expressie?
In de pijlvorm is break niet nodig. Als een blok wordt gebruikt (case X -> { ... }), kan yield worden toegepast om een waarde terug te geven:
int num = switch(x) { case 1 -> 10; case 2 -> { yield 20; } default -> 0; };
Klassieke switch met int zonder break:
switch(type) { case 1: actionA(); case 2: actionB(); // wordt aangeroepen voor zowel type==1 als type==2 }
Voordelen:
Nadelen:
Gebruik van de nieuwe switch-expressie voor het toewijzen van enum aan resultaat:
String status = switch(orderStatus) { case PAID -> "Betaald"; case CANCELED -> "Geannuleerd"; default -> "In behandeling"; };
Voordelen:
Nadelen: