Java - Modulsystem

Einführung in das Java-Modulsystem

Hallo, aspirierende Java-Programmierer! Heute werden wir auf eine aufregende Reise in die Welt des Java-Modulsystems aufbrechen. Als euer freundlicher Nachbar und Informatiklehrer bin ich hier, um euch Schritt für Schritt durch dieses faszinierende Thema zu führen. Keine Sorge, wenn ihr neu bei der Programmierung seid – wir beginnen mit den Grundlagen und arbeiten uns gemeinsam nach oben!

Java - Module System

Was ist ein Modul?

Lassen Sie uns mit einer einfachen Analogie beginnen. Stellt euch vor, ihr baut einen LEGO-Burg. Jeder LEGO-Stein repräsentiert einen Code-Baustein, und die Anleitung zeigt euch, wie ihr sie zusammenbaut. In Java ist ein Modul wie ein vorgefertigter Abschnitt eurer Burg – es ist eine Sammlung von verwandtem Code, die zusammenarbeitet, um spezifische Funktionen auszuführen.

In technischer Sprache ist ein Modul in Java eine selbstständige Einheit des Codes, die Folgendes umfasst:

  1. Klassen und Schnittstellen
  2. Ressourcen (wie Bilder oder Konfigurationsdateien)
  3. Eine klare Definition davon, was es von anderen Modulen benötigt
  4. Eine Deklaration davon, was es anderen Modulen bietet

Stellt euch vor, es wäre eine gut organisierte Werkzeugkiste, in der alles seinen Platz und Zweck hat.

Funktionen des Java-Modulsystems

Das Java-Modulsystem, das in Java 9 eingeführt wurde, bringt mehrere aufregende Funktionen mit sich. Lassen Sie uns sie eine nach der anderen erkunden:

1. Starke Encapsulation

Erinnert euch, wenn ihr Kind warst und eine Geheimkiste hattet, in der ihr eure Schätze aufbewahrtest? Module funktionieren ähnlich. Sie lassen euch entscheiden, welche Teile eures Codes für andere sichtbar sind und welche Teile eure "geheimen Schätze" sind.

module com.myapp.secretbox {
exports com.myapp.secretbox.api;
}

In diesem Beispiel sind nur die Klassen im Paket com.myapp.secretbox.api für andere Module sichtbar. Alles andere ist versteckt!

2. Zuverlässige Konfiguration

Module geben klar an, was sie von anderen Modulen benötigen. Es ist wie das Erstellen einer Einkaufsliste, bevor ihr zum Supermarkt geht – ihr wisst genau, was ihr benötigt und vergisst nichts!

module com.myapp.kitchen {
requires com.myapp.fridge;
requires com.myapp.stove;
}

Hier sagt unser kitchen-Modul, dass es die Module fridge und stove benötigt, um richtig zu funktionieren.

3. Verbesserte Leistung

Mit Modulen kann Java intelligenter darin sein, nur den Code zu laden, den es benötigt. Es ist wie nur die Kleidung zu packen, die ihr tatsächlich auf einer Reise tragen werdet, anstatt euren gesamten Kleiderschrank!

Das Deklarieren eines Moduls

Nun rollen wir die Ärmel hoch und erstellen unser erstes Modul. Wir beginnen, indem wir eine Datei namens module-info.java im Stammverzeichnis unseres Quellcode-Verzeichnisses erstellen.

module com.myapp.greetings {
exports com.myapp.greetings.api;
}

Diese einfache Deklaration erstellt ein Modul namens com.myapp.greetings und macht das Paket com.myapp.greetings.api für andere Module verfügbar.

Hinzufügen abhängiger Module

Manchmal benötigt unser Modul möglicherweise Code von anderen Modulen. Wir können diese Abhängigkeiten mit dem Schlüsselwort requires angeben.

module com.myapp.greetings {
requires com.myapp.translations;
exports com.myapp.greetings.api;
}

In diesem Beispiel benötigt unser greetings-Modul das translations-Modul, um korrekt zu funktionieren.

Hinzufügen optionaler Module

Was ist, wenn wir ein Modul haben, das schön ist, aber nicht unbedingt notwendig? Hier kommen optionale Module ins Spiel!

module com.myapp.greetings {
requires com.myapp.translations;
requires static com.myapp.fancyfonts;
exports com.myapp.greetings.api;
}

Das Schlüsselwort static sagt Java, dass das fancyfonts-Modul optional ist. Unser greetings-Modul funktioniert ohne es, aber es kann fancyfonts verwenden, wenn es verfügbar ist.

Hinzufügen transitischer Module

Manchmal möchten wir unsere Abhängigkeiten an Module weiterreichen, die von uns abhängen. Dies können wir mit dem Schlüsselwort transitive tun.

module com.myapp.greetings {
requires transitive com.myapp.translations;
exports com.myapp.greetings.api;
}

Nun erhält jedes Modul, das com.myapp.greetings benötigt, automatisch Zugang zu com.myapp.translations auch.

Exportieren öffentlicher Klassen

Wenn wir bestimmte Pakete für andere Module verfügbar machen möchten, verwenden wir das Schlüsselwort exports.

module com.myapp.greetings {
exports com.myapp.greetings.api;
exports com.myapp.greetings.utils to com.myapp.testing;
}

In diesem Beispiel machen wir das Paket api für alle Module verfügbar, aber das Paket utils ist nur für das Modul com.myapp.testing verfügbar.

Erlauben von Reflexion

Manchmal müssen wir anderen Modulen erlauben, Reflexion auf unsere Klassen anzuwenden. Dies können wir mit dem Schlüsselwort opens tun.

module com.myapp.greetings {
exports com.myapp.greetings.api;
opens com.myapp.greetings.internal to com.myapp.testing;
}

Dies erlaubt dem Modul com.myapp.testing, Reflexion auf Klassen im Paket com.myapp.greetings.internal anzuwenden.

Erstellen und Verwenden von Java-Modulen

Jetzt, da wir die Grundlagen abgedeckt haben, lassen wir es uns zusammenstellen und eine einfache modulare Anwendung erstellen. Wir werden zwei Module erstellen: com.myapp.greetings und com.myapp.main.

Erstellen wir zuerst das Modul com.myapp.greetings:

// module-info.java
module com.myapp.greetings {
exports com.myapp.greetings;
}

// com/myapp/greetings/Greeter.java
package com.myapp.greetings;

public class Greeter {
public static String greet(String name) {
return "Hallo, " + name + "!";
}
}

Jetzt erstellen wir das Modul com.myapp.main, das unser greetings-Modul verwendet:

// module-info.java
module com.myapp.main {
requires com.myapp.greetings;
}

// com/myapp/main/Main.java
package com.myapp.main;

import com.myapp.greetings.Greeter;

public class Main {
public static void main(String[] args) {
System.out.println(Greeter.greet("Java Module"));
}
}

Um diese modulare Anwendung zu kompilieren und auszuführen, verwenden wir die folgenden Befehle:

javac -d mods --module-source-path src $(find src -name "*.java")
java --module-path mods -m com.myapp.main/com.myapp.main.Main

Und voilà! Ihr habt gerade eure erste modulare Java-Anwendung erstellt und ausgeführt.

Fazit

Herzlichen Glückwunsch, dass ihr diese Einführung in das Java-Modulsystem geschafft habt! Wir haben viel Land zurückgelegt, von der Verständnis, was Module sind, bis hin zum Erstellen und Verwenden in einer realen Anwendung. Bedenkt, dass das Meistern von Modulen wie das Fahrradfahren übenсяt – es erfordert Praxis. Habt nicht Angst, zu experimentieren und Fehler zu machen – so lernen wir am besten!

Wenn ihr weiterhin auf eurer Java-Reise geht, werdet ihr feststellen, dass Module euch helfen, mehr organisierte, sichere und effiziente Anwendungen zu erstellen. Sie sind wie das geheime Ingrediens, das eure Programmierfähigkeiten von gut zu großartig macht.

Lasst weiterhin coden, lasst weiterhin lernen und vor allem, habt Spaß! Bis zum nächsten Mal, happy modulating!

Credits: Image by storyset