Groovy: Dynamisches Programmieren

Wenn Sie in Java den Aufruf der Methode m eines Objekts o der Klasse K programmieren, so wird dieser Aufruf in ein Stück Bytecode übersetzt, das nichts anderes tut als genau die von Ihnen genannte Methode m der Klasse K (oder einer Elternklasse) für das Objekt o aufzurufen. Nicht mehr und nicht weniger.

Da ist Groovy ganz anders. Der Methodenaufruf wird durch eine Kette von Framework-Klassen hindurchgeleitet, an deren Ende normalerweise auch der Aufruf der Methode m der Klasse K für das Objekt o steht. Abhängig von den Gegebenheiten kann aber auch etwas ganz anderes geschehen, beispielsweise kann eine Closure aufgerufen werden, die einer Property von o mit demselben Namen wie m zugewiesen worden ist. In dieser Kette von weiterdelegierten Methodenaufrufen gibt es mehrere Möglichkeiten, sich gewissermaßen einzuklinken und den Lauf des Geschehens abzuwandeln. Auf diese Weise können Sie beispielsweise dynamische Methoden einführen, die in der Klasse nicht definiert sind, sondern deren Funktionalität sich zur Laufzeit aus dem Methodennamen ergibt. Oder Querschnittsmethoden im Stile der aspektorientierten Programmierung, mit denen Aufrufe beliebiger anderer Methoden quer durch das ganze System ‒ etwa zur Protokollierung ‒ abgefangen werden können.

Dies alles gibt Ihnen die Möglichkeit, die Semantik der Sprache stark zu beeinflussen. Die Groovy-Standardbibliothek macht von dieser Möglichkeit verschiedentlich Gebrauch; ein Beispiel dafür sind die Ihnen bereits vertrauten Closures, weitere Beispiele folgen weiter unten in diesem Kapitel. Auch verschiedene „Groovy-Module“ (auf Groovy basierende Tools oder Erweiterungen) nutzen die Möglichkeiten, die sich aus den dynamischen Fähigkeiten von Groovy ergeben, allen voran die bekannte Web-Entwicklungsumgebung Grails, die einen großen Teil ihrer Einfachheit und Flexibilität der Nutzung von Groovy als Basis verdankt.

Um das dynamische Programmieren mit Groovy richtig zu verstehen, muss man sich zwangsläufig in gewissem Umfang mit den Innereien der Sprache und der Laufzeitumgebung auseinandersetzen. Dies werden wir hier aus Platzgründen nur in begrenztem Maße tun können; trotzdem sollten Sie die wichtigsten Mechanismen kennen, die Groovy-Objekte zu dynamischen Objekten machen. Denn dieses Wissen kann für das Verständnis der Sprache und dessen, was in einem Programm vor sich geht ‒ vor allem wenn einmal nichts geht ‒ von großem Nutzen sein. Zunächst wenden wir uns mit dem Expando und den Kategorienklassen erst einmal zwei Möglichkeiten zu, die wir nutzen können, ohne allzu viel von den internen Mechanismen verstehen zu müssen.

Kapitelinhalt Bearbeiten