Manifold – Unsichtbare Code-Generierung für die Praxis

Code-Generierung ist bei einigen Entwicklern allgemein eher unbeliebt, da sie zwar meist notwendig ist, in der Praxis jedoch häufig einige Probleme mit sich bringt. Daher wird dieses Mittel im Entwickleralltag häufig nur in den Bereichen eingesetzt, in denen es absolut notwendig oder längst selbstverständlich ist. Etwa bei der Generierung von hashCode()-/equals()-Methoden in Java oder Getter und Setter in Domainobjekten.

An dieser Stelle setzt Manifold an. Denn automatische Code-Generierung, insbesondere wenn sie unsichtbar für die Entwickler im Hintergrund abläuft, kann einige Vorteile haben. So können etwa fehlende Sprachfeatures nachgerüstet werden und unnötige Fleißarbeit auf ein Minimum reduziert werden. Da Manifold jedoch über ein Compiler-Plugin arbeitet, erkauft man sich die oben genannten Vorteile durch einen gewissen Lock-In. Ein direkter Ausbau durch eine Realisierung der “unsichtbaren Klassen” im Hintergrund zu echten Java-Klassen, wie etwa bei TypeScript, wäre vielleicht für einige Features von Manifold möglich, allerdings nur in der Theorie.

Da Manifold ein recht mächtiges und umfangreiches Framework ist, wird es dazu eine ganze Serie an Blogartikeln geben.

Die Hauptfeatures im Überblick

Manifold bietet mehrere größere Kernfeatures. Die drei Hauptfeatures sind laut eigenen Angaben die typsichere Metaprogrammierung, Erweiterungsmethoden und Structural Typing. Bei der Metaprogrammierung geht es darum, herkömmliche Code Generatoren zu substituieren. Mit Erweiterungsmethoden kann man in Java-Klassen, welche nicht zum eigenen Projekt gehören, sondern beispielsweise aus der Java Platform API oder einer fremden Bibliothek stammen, neue Methoden einfügen. So könnte man etwa der Klasse java.lang.String eine Methode revert() hinzufügen, welche dann den String umdreht. Beim Structural Typing geht es um sogenanntes Duck-Typing. Das bedeutet, dass der Typ eines Objektes nicht durch seine Klasse, sondern durch sein Struktur, zum Beispiel die vorhandenen Methoden, implizit spezifiziert ist.

Neben diesen Hauptfeatures gibt es noch zahlreiche sogenannte Components, die die Hauptfeatures realisieren und verwenden. Dazu gehören etwa eine JSON-Integration, typsicheres Templating, Structural Interfaces, typsichere Reflections und Self-Types. Einige dieser Hauptfeatures sollen in den folgenden Artikeln dieser Artikelserie beschrieben werden.

Der Trick bei Manifold ist, dass der für die nicht im Sprachumfang von Java enthaltenen Features benötigte Java-Code nicht wie bei herkömmlichen Codegeneratoren als .java-Dateien auf die Festplatte generiert wird, um dann vom Compiler weiterverarbeitet zu werden. Stattdessen wird der Java-Code im Build-Schritt on-the-fly erzeugt und gar nicht erst sichtbar ins Projekt persistiert. Dies sorgt dafür, dass eine IDE mit dem richtigen Plugin zwar Recommendations anzeigen kann, aber gleichzeitig die üblichen Probleme von Codegeneratoren, wie fehlerhaftes Caching oder obsolete Java-Klassen, gar nicht erst auftreten können.

Artikelübersicht

  • Einfache JSON Integration in Java ohne JAXB
  • Fremde Java-Klassen erweitern: Extensions
  • Vererbung in Java Austricksen: Structural Interfaces
  • Typsichere Reflections in Java
  • Bessere Builder in Java: Self Type
Short URL for this post: https://wp.me/p4nxik-3jH
Steffen Jacobs

About Steffen Jacobs

Java Consultant & Developer at Orientation in Objects GmbH. Follow me on Twitter and find me on LinkedIn and Xing. Some of the source code associated with the blog articles can be found on GitHub.
This entry was posted in Java and Quality and tagged , , . Bookmark the permalink.

1 Response to Manifold – Unsichtbare Code-Generierung für die Praxis

  1. Pingback: Einfache JSON Integration in Java ohne JAXB mit Manifold | techscouting through the java news

Leave a Reply