Fremde oder Freunde? Eingeschränkte Exporte mit Jigsaw

Java 9 Bootcamp Logo

In den vorangegangen Teilen dieser Blog-Serie ( Teil 1, Teil 2, Teil 3, Teil 4, Teil 5) haben wir gelernt, wie man Anwendungen aus Modulen baut und Modul-Abhängigkeiten festlegt. Eine Haupt-Motivation für die modularisierung zur Laufzeit ist es, den Zugriff auf interne Bereiche eines Moduls beschränken zu können. Man legt nun explizit fest, auf was die öffentliche API eines Moduls ist. Innerhalb des Modulsystems gibt es dann keine Möglichkeit nicht-öffentlichen Code aufzurufen.

Was man von IDEs lernen kann

In existierenden Modulsystemen gibt es jedoch noch mehr Steuerungsmöglichkeiten. Die bekannten Entwicklungsumgebungen Eclipse und NetBeans sind ein gutes Beispiel. Sie sind schon seit vielen Jahren modular aufgebaut. Viele Module dieser IDEs haben ebenfalls öffentliche Programmierschnittstellen, damit Mitglieder der Community Plugins entwickeln können. Es gibt jedoch auch "halb"-private APIs. Das sind Schnittstellen, welche nur bestimmten Modulen (bei NetBeans heisst das "Friend"-Module) Zugriff gewähren.

Das Modul listet die Friend-Module fürs Modulsystem auf. Dieses stellt sicher, dass nur Berechtigte zugreifen.

Das wird immer dann so gemacht, wenn eine API noch nicht wirklich stabil ist. Dadurch dass der Kreis der Beteiligten klein und bekannt ist, kann die API immer noch geändert werden. Man weiss ja, wen man informieren muss, meist ist es ein Kollege im Büro nebenan. Wenn jemand aus der Community Zugriff möchte kann er ebenfalls den Modul-Eigner kontaktieren und darum bitten in die Liste aufgenommen zu werden. Zumindest bei NetBeans war das in der Vergangenheit kein Problem. Wichtig ist ja nur, dass jeder Nutzer der API bekannt ist.

Friend-Module in Jigsaw

Java 9 Bootcamp Logo

Auch in Jigsaw wird das so gehandhabt. Ich kann zum Beispiel sicherstellen, dass meine "greetingcomposer"-API nur von meinem "hello"-Modul gelesen werden kann. Dazu passe ich die module-info entsprechend an:

module de.eppleton.greetingcomposer{
        requires transitive de.eppleton.datamodel;
        exports de.eppleton.greetingcomposer
            to de.eppleton.hello;
}

Wenn ich meine Package mehreren Modulen zur Verfügung stellen möchte, werden diese durch Kommas getrennt angegeben.

Besuchen Sie unsere Workshops zum Thema Java 9 um mehr über dieses und weitere neue Features von Java 9 zu erfahren: