Geschiedenis van de vraag
Pattern matching is een techniek die is overgenomen uit functionele en script-talen, die het mogelijk maakt om het type te controleren en gegevens in één stap te extraheren. De ontwikkeling van pattern matching in Java begon met Java 14 (previewfunctie), verbeterde in Java 16-17, en wordt in de laatste versies uitgebreid naar switch.
Probleem
De klassieke manier van typecontrole en casten was omslachtig:
if (obj instanceof String) { String s = (String) obj; ... }
Er ontstonden onnodige variabelen, een groot aantal sjablooncodes en het risico op type-castfouten.
Oplossing
Pattern matching maakt het mogelijk om typecontrole, de declaratie van een nieuwe variabele en het gebruik daarvan in één expressie te combineren:
if (obj instanceof String s) { System.out.println(s.length()); }
Vergelijkbare patronen verschijnen nu ook in de switch-constructie, wat de code compacter maakt en minder foutgevoelig.
Belangrijke kenmerken:
Kan pattern matching worden gebruikt voor aangepaste (gebruikers)klassen of alleen voor standaardtypes?
Het kan voor alle klassen worden gebruikt. Pattern Matching werkt voor alle klassen die instanceof kunnen gebruiken.
Zal de patroonvariabele buiten het if/switch-blok toegankelijk zijn?
Nee, de binnen pattern matching gedeclareerde variabele is alleen zichtbaar binnen het blok waarin deze is gemaakt (bijvoorbeeld binnen if of case switch).
Voorbeeldcode:
if (obj instanceof Integer i) { // i is alleen zichtbaar in dit blok System.out.println(i + 10); } // Hier is i niet toegankelijk
Kan pattern matching met generics worden gebruikt?
Ja, zo:
Object list = List.of("a", "b"); if (list instanceof List<?> l) { System.out.println(l.size()); }
Maar het werken met raw-types en casten naar geparametriseerde types blijft beperkt door type-erasure.
Het team heeft pattern matching geïmplementeerd in alle gevallen, inclusief interne DTO's, serviceklassen en gevallen waar polymorfisme voldoende was. De code is te sterk afhankelijk van instanceof, waardoor de rol van klassenhiërarchieën vervaagt.
Voordelen:
Nadelen:
In het project werd pattern matching alleen toegepast voor algemene interfaces, hulpprogramma's en het verwerken van collecties van onbekend type. De OOP-architectuur blijft behouden, met het gebruik van het patroon alleen wanneer het onvermijdelijk is.
Voordelen:
Nadelen: