© andrea crisante/Shutterstock.com
Manifold - Außerirdische Technik für die dynamische Erweiterung von Javas Typsystem

Nicht von dieser Welt


Manifold wirkt extraterrestrisch. Das Framework ermöglicht Entwicklern, das Typsystem von Java dynamisch und nahtlos zu erweitern. Wir untersuchen die neuartige Technik und beobachten, wie Manifold die Java-Entwicklung attraktiver und produktiver macht.

So futuristisch das „Einsatzprotokoll“ erscheint, es entspricht zu 100 Prozent den Tatsachen. Manifold ist als Open-Source-Projekt von Manifold Systems [1] verfügbar; ob es sich um eine rekonstruierte Alientechnologie handelt, muss noch geklärt werden. Sie können Manifold mit Ihrem neuen oder bestehenden Java-Projekt nutzen.

Einsatzprotokoll

Einsatzort: GEHEIM
Termin: 24.11.17
Uhrzeit: 22:15 Uhr
Programmierer: GEHEIM
Sprache: Java
Software: IntelliJ IDEA

Details zum Vorfall: Zielperson erstellt eine JSON-Datei, Person.json, als Java-Ressource im Paket com.abc. Die Zielperson begann sofort mit der Verwendung der JSON-Datei aus Java-Klassen im Projekt, als ob es sich bei ihr um eine Java-Klasse vom Typ com.abc.Person handele. Als die Zielperson Eigenschaften der JSON-Datei änderte und hinzufügte, wurden die Änderungen augenblicklich an anderer Stelle im Projekt per Codevervollständigung usw. verfügbar. Später führte die Zielperson einen Rename Refactor an der JSON-Datei durch, es erfolgte eine Umbenennung von Person zu Kontakt. Alle Referenzen zu Person wurden ohne Verzögerung in Kontakt abgeändert. Weiterhin führte die Zielperson mehrere Suchanfragen und Refactorings an den JSON Properties und -Typen durch, alle zeigten ein Verhalten, als wenn es sich bei JSON um Java handeln würde.

Auffallend ist, dass es keine generierten Klassendateien auf der Festplatte gab, die mit der JSON-Datei korrespondierten, nachdem die Zielperson das Projekt kompiliert hatte – keine zusätzlichen Build-Schritte, keine Artefakte. Die Zielperson erstellte mehrere Tests für das Projekt und führte sie ohne Zwischenfälle durch. Die JVM schien die JSON-Datei als Java-Klassendatei zu verwenden. Es waren keine zusätzlichen Class Loader involviert, es wurden keine Runtime-Agenten verwendet. Nur eine einzige .jar-Datei im Klassenpfad kam zum Einsatz: manifold.jar.

Es wurden ähnliche Ereignisse mit JavaScript-Dateien, Properties und verschiedenen anderen beobachtet. Die Technologie scheint mit jeder Art von Datenquelle kompatibel zu sein. Offenbar kann mit der Technologie das Typsystem von Java nach Belieben erweitert werden. Andere in jüngster Zeit beobachtete Zielpersonen führten andere absonderliche Aktivitäten durch. Extension Methods wurden wie in C# definiert, strukturelle Typisierung wurde wie in den Sprachen TypeScript und Go genutzt. Weitere Informationen folgen in Kürze.

Fazit: Der Vorfall zeigt Technologie der nächsten Generation. Weitere Beobachtungen sind dringend empfohlen.

Fügen Sie das Framework einfach als Abhängigkeit zu Ihrem Projekt hinzu. Manifold wurde entwickelt, um mit IntelliJ IDEA zu arbeiten, das frei von JetBrains erhältlich ist. Weitere Informationen zur Verwendung von Manifold mit Ihren Projekt- und Build-Werkzeugen finden Sie in der Set-up-Anleitung für Manifold [2]. Das Framework bietet drei wichtige Features:

  • Typsichere Metaprogrammierung: vergleichbar mit F#-Type-Providern

  • Extension Method: vergleichbar mit dem gleichen Feature in Kotlin und C#

  • Strukturelle Typisierung: ähnlich wie Interfaces in TypeScript und Go

Typsichere Metaprogrammierung

Metaprogrammierung ist ein Begriff, der normalerweise für dynamische Sprachen wie JavaScript, Ruby und Python reserviert ist. Dabei handelt es sich um ein mächtiges Feature für die dynamische Typerstellung, das die fehlende Typsicherheit zur Designzeit in diesen Sprachen ausnutzt – denn sämtlicher Hokuspokus um die Metaprogrammierung ist ein Laufzeitphänomen. Obwohl sie ein flexibles Konzept ist, stellt Metaprogrammierung eine Herausforderung für Programmierer dar, da es keine Typinformationen zur Designzeit gibt, die leicht zu entdecken und verwenden wäre; dabei muss man sie nur kennen.

Der Reiz von Manifold liegt in der Fähigkeit, sowohl Kompilier- als auch Laufzeitmetaprogrammierung durchzuführen. Diese Fähigkeit wird über Type Manifolds (Typverteiler) erreicht. Das sind Java-Projektionen schematisierter Datenquellen, die als Brücke zwischen den Welten der Information und der Programmierung dienen. Genauer gesagt transformiert ein Type Manifold eine Datenquelle in einen Datentyp, auf den der Java-Code direkt zugreifen kann, ohne Build-Schritt oder zusätzliche Kompilierungsartefakte. Kurz gesagt: Mit Manifold ist eine Datenquelle ein Datentyp. Normalerweise greift man etwa auf Java-Property-Ressourcen wie folgt zurück:

java Properties myProperties = new Properties(); myProperties.load(getClass().getResourceAsStream("/abc/MyProperties.properties")); String myMessage = myProperties.getProperty("my.message");

Wie bei jeder Quelldatei ist eine Properties-Datei für das Java-Typsystem fremd – es gibt keinen direkten, typsicheren Zugriff darauf. Stattdessen greifen Sie indirekt über den mit hartcodierten Strings bestückten Boilerplate-Library-Code darauf zu. Im Gegensatz dazu greifen Sie mit dem Typverteiler Properties direkt auf eine Properties-Datei als Typ zu: java String myMessage = MyProperties.my.message; Das Ganze ist präzise und typsicher, ohne generierte Dateien oder andere Build-Schritte. Fast jede erdenkliche Art von Datenquelle ist ein potenzieller Typverteiler. Dazu gehören Ressourcendateien, Schemata, Abfragesprachen, Datenbankdefinitionen...

Neugierig geworden? Wir haben diese Angebote für dich:

Angebote für Gewinner-Teams

Wir bieten Lizenz-Lösungen für Teams jeder Größe: Finden Sie heraus, welche Lösung am besten zu Ihnen passt.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang