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

Null-safe switch

06.01.2023
Jak se vyhnout problémům s NULL hodnotou při vyhodnocení podmínky příkazu switch?
----------------------------------------

Switch je způsob, jak (nejen) v Javě rozdělit kód do více větví podle hodnoty kontrolní proměnné. Použít jde tradičně na ordinální datové typy, výčtové typy (enum) a od Java 7 na řetězce. Java 17 čerstvě přichází s pattern matchingem, který okruh možností dále rozšiřuje. To je však téma na samostatný článek.

Stejně jako v případě .equals() se i v příkazu switch skrývá hrozba. Nemůžete do něj poslat null, aniž by se urazil a nevyplivl NullPointerException.

Tradiční řešení je obalit switch kontrolní podmínkou:

if (variable != null) {
    switch(variable) {
    }
}

Jsou to ale dva řádky + odsazení navíc. Mě se proto víc líbí varianta s ternárním operátorem. Protože nikde není psáno, že uvnitř závorek za klíčovým slovem switch musí být hodnota. Může tam klidně být i výraz, tedy:

switch(variable != null ? variable : <<default>>) { … }

Krom úspory místa se to může hodit třeba v případě, že chcete mít stejnou default akci (například zahlásit „Neznámá akce“) jak pro neznámou hodnotu i pro null. Teď prostě obojí dáte do default labelu uvnitř switch výrazu.

Optional?

Java 8 umožňuje alternativní použití třídy Optional, kde by zápis vypadal takto:

switch(Optional.ofNullable(variable).orElse(<<default>>)) { … }

Je to o malinko delší, ale třeba pro někoho srozumitelnější a čitelnější než ternární operátor. Navíc pokud instanci třídy Optional už máte v kódu k dispozici, pak už hraje srovnání čitelnosti jednoznačně pro tuto variantu:

Optional<String> optVar = Optional.ofNullable(variable)
switch(optVar.orElse(<<default>>)) { … }
----------------------------------------