Apache Groovy 3.0 lässt den Papagei parsen

Das jüngste Major Release der Programmiersprache bietet zahlreiche neue Funktionen, darunter ein flexiblerer Parser mit dem Codenamen Parrot.

In Pocket speichern vorlesen Druckansicht 5 Kommentare lesen
Apache Groovy 3.0 lässt den Papagei parsen
Lesezeit: 4 Min.
Von
  • Matthias Parbel

Die Apache Software Foundation hat Version 3.0 der Programmiersprache Groovy vorgelegt. In das Major Release der JVM-Sprache (Java Virtual Machine) sind eine Reihe von Fehlerbereinigungen und Verbesserungen eingeflossen, aber auch einige wichtige neue Funktionen. Zu den bedeutenden Neuerungen zählen der umfassend überarbeitete Parrot Parser sowie weitere Anpassungen an die Erfordernisse des Java Platform Module System.

Den Codenamen Parrot führt der neue Parser, weil er zunächst lediglich wie ein Papagei ein exaktes Echo des Outputs liefern sollte, den der alte Parser in Groovy erzeugte. Die nun vorgelegte Version geht allerdings deutlich darüber hinaus und unterstützt sowohl zusätzliche Syntax-Optionen wie auch ein breiteres Spektrum an Sprachfunktionen. Groovy-Entwicklern steht jetzt unter anderen die Java-Klasse do/while loop zur Verfügung, ebenso wie die for loop mit Komma-separierten Ausdrücken. Auch die bereits in Groovy 1.6 eingeführten Multi-Assignment Statements lassen sich jetzt in for loop nutzen.

Einzug in das neue Release nehmen auch die in der Java-Syntax vorgesehenen Lambda-Ausdrücke. Entwickler können dabei nicht nur die normalen Varianten verwenden, sondern Groovy fügt noch zusätzliche Funktionen hinzu – darunter etwa Standardparameterwerte, wie die nachfolgenden Beispiele zeigen. Während beim Einsatz von @CompileStatic für statischen Groovy-Code native Lambda-Ausdrücke erlaubt sind, werden sie für dynamischen Code noch in die äquivalenten Groovy Closures umgewandelt: Demnach bedeutet (e) { println e } das gleiche wie {e println e}.

// general form
def add = (int x, int y) -> { def z = y; return x + z }
assert add(3, 4) == 7

// curly braces are optional for a single expression
def sub = (int x, int y) -> x - y
assert sub(4, 3) == 1

// parameter types are optional
def mult = (x, y) -> x * y
assert mult(3, 4) == 12

// no parentheses required for a single parameter with no type
def isEven = n -> n % 2 == 0
assert isEven(6)
assert !isEven(7)

// no arguments case
def theAnswer = () -> 42
assert theAnswer() == 42

// any statement requires braces
def checkMath = () -> { assert 1 + 1 == 2 }
checkMath()

// example showing default parameter values (no Java equivalent)
def addWithDefault = (int x, int y = 100) -> x + y
assert addWithDefault(1, 200) == 201
assert addWithDefault(1) == 101

Ähnliches gilt für die aus Java 8 stammende Syntax zum Referenzieren von Methoden mit doppelten Doppelpunkten, die Groovy 3.0 grundsätzlich unterstützt. Nativer Support ist zunächst aber nur beim Einsatz von @CompileStatic gewährleistet. Für dynamischen Code erfolgt die Implementierung als Closure-Methodenreferenz, sodass String::toUpperCase gleichzusetzen ist mit String.&toUpperCase.

Groovy 3.0 soll nun außerdem den Weg bereiten zu einer besseren Anpassung an die Vorgabe des Java Platform Module System, dass Klassen in eindeutigen Modulen eindeutige Paketnamen haben. Während Groovy die eigenen Module traditionell anders strukturiert, sollten ab JDK 9 Groovy 2.x und 3.0 nicht zum Modulpfad, sondern dem Klassenpfad hinzugefügt werden. Dadurch wandern die Klassen in ein nicht benanntes Modul, in dem die Anforderung des Split Package Naming nicht zwingend umgesetzt werden muss.

Während die Groovy-Entwickler für Version 4.0 vollständige Kompatibilität anstreben, leitet das 3.0-Release die Migration der Klassen nun ein. Bei einem Teil der betroffenen Klassen kann es in Groovy 3.0 sinnvoll sein, zwei Versionen vorzuhalten: Eine als veraltet (deprecated) markierte Klasse mit dem alten Paketnamen und eine neue Klasse mit neuem Paketnamen. Auch wenn das Neukompilieren der bisherigen Klassen in den meisten Fällen problemlos funktionieren sollte, empfehlen die Entwickler mit Blick auf Groovy 4.0 eine zügige Migration. Eine Gegenüberstellung der betroffenen Klassen- und Paketnamen einschließlich Anmerkungen findet sich in den Release Notes.

Dort sind außerdem mehr Details zu den wichtigsten Neuerungen von Groovy 3.0 zusammengefasst. Eine komplette Liste sämtlicher Bugfixes und Verbesserungen gegenüber der Vorversion findet sich im Changelog. Binaries, Code, Dokumentation und SDK-Bundles können über die Projekt-Website heruntergeladen werden und stehen auf GitHub bereit. (map)