Master Coda - Logo
Master Coda
Nepravidelný blog o programování

Vylepšený switch v Java 17

12.01.2023
Příjemné syntaktické novinky v (zatím) poslední LTS verzi Javy
----------------------------------------

Nedávno jsem to psal do jedné FB diskuse a několika uživatelům se to líbilo. Pak ale autor vlákna celou diskusi najednou smazal. Tak jsem rozhodl sepsat to rovnou jako trvalý článek.

Java se postupně mění a podle mě se většinou mění k lepšímu. Jedním z příkladů vývoje v nejnovější LTS verzi Java 17 ze září 2021 evoluce příkazu switch. Jako ukázkový příklad mám jednoduchý úkol - vezmi náhodné číslo 1-7 a vypiš počet písmen v anglickém názvu příslušného dne v týdnu.

Ve "staré" verzi switch by to hlavní vypadalo třeba takto:

int numLetters = -1;
switch` (day) {
  case MONDAY:
  case FRIDAY:
  case SUNDAY:
    numLetters = 6;
    break`;
  case TUESDAY:
    numLetters = 7;
    break`;
  case THURSDAY:
  case SATURDAY:
    numLetters = 8;
    break`;
  case WEDNESDAY:
    numLetters = 9;
    break`;
}
System.out.println("Pocet pismen: " + numLetters);

Vylepšený switch umí dvě věci - spojit větve se stejnou obsluhou na jeden řádek s využtím nového symbolu -> a tím ušetřit místo. Tedy např.:

case MONDAY, FRIDAY, SUNDAY -> System.out.println(6);

Za -> může následovat buďto jediný příkaz nebo blok kódu. Zároveň už není třeba psát klíčové slovo break, aby kód nepropadl do další větve pod tím.

Druhá vymoženost je ještě zajímavější - switch teď umí jako celek přímo vracet nějakou hodnotu. Kompilátoru se to sdělí tak, že začneme psát var variable = switch { … }. Je třeba myslet na tři věci:

  • Je-li kód větve v bloku, návratová hodnota se uvozuje klíčovým slovem yield
  • Návratové typy všech větví musí být všechny stejné
  • Musí být pokryty všechny varianty vstupu (většinou řešitelné přes default)

Spojíme-li to vše dohromady, výsledkem je:

int numLetters = switch (day) {
  case MONDAY, FRIDAY, SUNDAY -> 6;
  case TUESDAY -> 7;
  case THURSDAY, SATURDAY -> 8;
  case WEDNESDAY -> 9;
  case -> {
    System.out.println("Default vetev (ukazka s blokem kodu + yield)");
    yield -1;  
  }
};
System.out.println("Pocet pismen: " + numLetters);

Za mě mnohem kratší, kompaktnější a hezčí.

Další odkazy

----------------------------------------
Vylepšený switch v Java 17 @ Master Coda
Zobrazit zdrojový kód článkuNavrhnout úpravu