Dit artikel van Hanno Embregts en Peter Wessels verscheen oorspronkelijk in Java Magazine #2-2021 en is met permissie van de NLJUG hier gepubliceerd.
Pattern Matching maakt Java nóg krachtiger
Lambda’s en streams hebben zich sinds Java 8 in onze geliefde taal gemanifesteerd en zijn een krachtig middel geworden.
In de komende versies van Java worden meer bewezen features uit functionele talen geïntegreerd.
Eén daarvan is pattern matching (niet te verwarren met reguliere expressies): een elegante manier om de kenmerken van een object te testen.
Wij zochten uit wat er nu al mogelijk is door de introductie van JEP 305 (‘Pattern Matching for instanceof’) en hoe verdere pattern matching-plannen Java een nóg krachtigere taal kunnen maken.
Iedereen maakt het wel eens mee: je wilt bepalen of een object van een bepaald type is om er een methode van dat type op uit te voeren.
Zo’n constructie vergt meestal dezelfde handelingen: een instanceof-test, het casten van het object en het toekennen van het resultaat aan een variabele. Zulke taalconstructies zijn repetitief, foutgevoelig en bovenal vervelend om te moeten schrijven.
Dat moet toch simpeler kunnen!
Type Patterns
‘Pattern Matching for instanceof’[1], sinds Java 14 een preview feature, beschrijft een eerste stap in het toevoegen van pattern matching aan Java.
Met deze functionaliteit kunnen we de drie eerder genoemde stappen vervangen door slechts één expressie[2] (zie Listing 1).
In het voorbeeld definiëren we een pattern Musical m, dat bestaat uit een type Musical en een label m.
In een instanceof-test wordt het type gebruikt om een object van dat type te matchen.
Nadat de match heeft plaatsgevonden, wordt het object automatisch gecast en toegekend aan de variabele met het gedefinieerde label.
Zo vervang je met een enkel pattern de expliciete cast en het toekennen aan een variabele. In een equals-methode is de impact wellicht nog beperkt, maar de kracht wordt pas echt duidelijk wanneer we in de toekomst pattern matching kunnen gaan gebruiken in een switch-expressie[3].
De syntax kan nog wijzigen[4], maar een voorbeeld zie je in Listing 2. Je ziet het; het combineren van de nieuwe switch-expressie met pattern matching levert verrassend korte en bondige code op.
En dit is nog maar het begin.