Null-safe 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>>)) { … }