Pattern Matching Avansat în Java: Expresii switch Tipizate, Record Patterns și Clauze when în Java

Pattern matching Java 21 LTS

Ghid complet pentru Pattern Matching în Java 21 LTS: expresii switch pe tipuri de date, deconstruirea atomică a Record-urilor cu Record Patterns, clauze de gardă when și tratarea valorilor null.

Sintaxă
switch (obj) { case User(String name, int age) when age >= 18 -> ... }

Lansat ca facilitate stabilă în Java 21 LTS, mecanismul modern de Pattern Matching pentru switch și Record Patterns transformă Java într-un limbaj expresiv și concis, aducând la zi verificarea tipurilor din stilul vechi bazat pe lanțuri fragile de if (obj instanceof Clasa) { Clasa c = (Clasa) obj; }.

Compilatorul verifică exhaustivitatea ramurilor și permite deconstruirea directă a câmpurilor unui record direct în clauza case, alături de predicaturi logice rafinate prin cuvântul cheie when.

Pattern Matching pe Switch și Deconstruire de Record-uri
// Definirea unei ierarhii de evenimente:
sealed interface Eveniment permits PlataEfectuata, Autentificare, Deconectare {}
record PlataEfectuata(String client, double suma, String moneda) implements Eveniment {}
record Autentificare(String utilizator, String adresaIp) implements Eveniment {}
record Deconectare(String utilizator) implements Eveniment {}

public class EventProcessor {

    public String analizeazaEveniment(Eveniment ev) {
        // Expresie switch exhaustivă (nu necesită ramură 'default' deoarece Eveniment este sealed!):
        return switch (ev) {
            // Record Pattern cu deconstruire directă a câmpurilor și clauză de gardă 'when':
            case PlataEfectuata(String client, double suma, String moneda) when suma > 10_000 ->
                "ALERTA FRAUDA: Tranzacție masivă inițiată de " + client + ": " + suma + " " + moneda;

            case PlataEfectuata(String client, double suma, String moneda) ->
                "Plată procesată normal pentru " + client + ": " + suma + " " + moneda;

            case Autentificare(String user, String ip) when ip.startsWith("192.168.") ->
                "Autentificare locală de rețea pentru: " + user;

            case Autentificare(String user, String ip) ->
                "Autentificare externă din IP: " + ip + " pentru utilizatorul: " + user;

            case Deconectare(String user) ->
                "Sesiune încheiată: " + user;

            // Tratarea curată și sigură a referințelor nule direct în switch:
            case null -> "Eveniment invalid (nul)!";
        };
    }
}

Deconstruire Ierarhică Cuibărită (Nested Record Patterns)

Dacă un record conține un alt record, Java permite deconstruirea în adâncime într-un singur pas elegant:

record Punct(int x, int y) {}
record Dreptunghi(Punct coltStanga, Punct coltDreapta) {}

// Extragem direct coordonatele interne fără apeluri intermediare get:
if (forma instanceof Dreptunghi(Punct(var x1, var y1), Punct(var x2, var y2))) {
    System.out.println("Lățime dreptunghi: " + Math.abs(x2 - x1));
}