Pattern-Matching mit switch-case

Seit Java 21 kann innerhalb einer switch-case-Struktur eine Fallunterscheidung nach Typen mit Hilfe von Pattern-Matching durchgeführt werden.

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. https://openjdk.org/jeps/441

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.