Pattern-Matching mit switch-case
v.21Die Typprüfung
einer Referenz-Variablen kann generell durch Pattern
Matching und den Operator instanceof
erfolgen. Ab Java 21, vorher bereits als Preview
Feature, kann dies auch im Rahmen der
Fallunterscheidung mit switch-case erfolgen.1.
Zur Verdeutlichung der Syntax sei die folgende Klassenhierarchie gegeben:
class Person { } class Vater extends Person { } class Mutter extends Person { } class Sohn extends Vater { String hallo() { return "Hallo Papa!"; } }
Soll ein von Person
abgeleitetes Objekt auf
die Zugehörigkeit zu ihrer Oberklasse geprüft
werden, kann dies nun z.B. folgendermaßen erfolgen:
Person p = new Sohn(); switch (p) { case null -> System.err.println("Keine Person angegeben."); case Sohn s -> System.out.println(s.hallo()); case Mutter m -> System.out.println("Ich bin die Mama."); case Vater v -> System.out.println("Ich bin der Papa."); default -> System.out.println("Die Person gehört nicht zur Familie."); }
Hier wird zunächst das zu prüfende Sohn
-Objekt
erzeugt und in einer Variablen vom Typ Person
abgelegt [1]. Dies kann nun auf die Zugehörigkeit
zu einer der drei Subspezies von Person
innerhalb einer switch-case-Fallunterscheidung
geprüft werden.
Hierbei ist ebenfalls neu, dass innerhalb der
Fallunterscheidung direkt auf null
geprüft wird [3]. Vor Java 21 war dies nicht
möglich; switch
warf bis zu dieser
Version bei Übergabe von null
eine NullPointerException
,
sodass eine vorgezogene Prüfung notwendig war. Dies
kann nun entfallen.
Die case label der drei zu prüfenden Typen werden dann als Pattern realisiert. Hierzu wird für jeden Fall eine Variable des entsprechende Typs gebildet und diese dann mit dem zu prüfenden Objekt verglichen. Erwarungsgemäß erzeugt das Snippet die Ausgabe Hallo Papa!.
Quellen
1) siehe https://javabeginners.de/Grundlagen/Operatoren/Objekttyp_ermitteln.php#PatternMatching
Wenn Ihnen javabeginners.de gefällt, freue ich mich über eine Spende an diese gemeinnützigen Organisationen.