© Excellent backgrounds/Shutterstock.com
Multilingual: Clojure in Java-Applikationen

Mehrsprachig glücklich


Viele JVM-Sprachen nutzen das Java-Ökosystem und haben dadurch den Vorteil, Java-Bibliotheken ohne großen Aufwand nutzen zu können. In umgekehrter Richtung sieht es nicht immer so einfach aus. Gerade dynamische Sprachfeatures lassen sich in Java-Code nur umständlich verwenden. Diese Artikelserie geht auf die populärsten JVM-Sprachen und ihre Integration in Java-Applikationen ein. Den Anfang macht der Lisp-Dialekt Clojure.

Ein Großteil aller Systeme, die auf der Java Virtual Machine ihren Dienst tun, ist in Java geschrieben. Trotzdem war die JVM schon immer offen für weitere Sprachen. Solange diese gültigen Bytecode erzeugen, können sie alle Vorteile der JVM nutzen. Mit der Einführung von invokedynamic wurde die Tür zur effizienten polyglotten Entwicklung schließlich ganz aufgestoßen [1]. Inzwischen existieren mehrere Dutzend JVM-Sprachen [2], die mehr oder minder bekannt sind. Eine der interessantesten davon ist Clojure, ein Lisp-Dialekt, der funktionale Programmierung mit all seinen Vorteilen bereitstellt. Will man nicht gleich sein ganzes Projekt in dieser Sprache erneut entwickeln, stellt sich unweigerlich die Frage, wie sich Clojure-Code sauber in Java-Projekte integrieren lässt.

Artikelserie: Praktische Polyglottie

Teil 1: Clojure

Teil 2: Scala

Teil 3: Groovy

Teil 4: Jython

Java Interop – Minimales Interface reicht aus

Clojure stellt ab Version 1.6 ein minimales API zur Kommunikation mit Java zur Verfügung, das aus dem Interface clojure.lang.IFn und der Klasse clojure.java.api.Clojure besteht. In Listing 1 ist ein einfaches Beispiel aus der offiziellen Dokumentation [3] dargestellt. Mit Clojure.var wird dort die Funktion + geladen. Anschließend ruft invoke diese Funktion auf und gibt ein Ausgabeobjekt zurück.

Auch komponierte Funktionen sind möglich, indem die einzelnen Funktionen zuerst geladen und dann mit übergeben werden, wie im Beispiel von map und inc. Der Aufruf zeigt auch, wie Datenstrukturen als String übergeben werden können. Der String "[1 2 3]" wird mit der Clojure-Funktion read dynamisch in einen Clojure-Vektor umgewandelt.

Diese einfache Art und Weise, Clojure einzubinden, führt aber zu vielen Baustellen im Code, an denen Funktionen geladen werden. Das möchte man vermeiden, da es die Codebasis schwieriger zu warten und zu lesen macht. Zusätzlich zum vorhandenen Boilerplate-Code, der beim Laden der Funktion entsteht, ist nämlich auch noch ein Cast auf den richtigen Typen notwendig.

Listing 1: Clojure in Java integrieren

Ifn plus = Clo...

Exklusives Abo-Special

Angebote für Teams

Für Firmen haben wir individuelle Teamlizenzen. Wir erstellen Ihnen gerne ein passendes Angebot.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang