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.
// 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));
}