GEDOPLAN
JavaJava SE

Module Import Declarations in Java 25: Echter Nutzen oder eher nicht so?

JavaJava SE
jarmoluk old books 436498 1280

Ein kleines, oft übersehenes Feature, das mit Java 25 offiziell in den Standard aufgenommen wurde, ist Module Import Declarations (JEP 511). Mit Module Import Declarations kann man jetzt auf die länglichen Listen von imports und static imports verzichten und alle Packages, die aus einem gemeinsamen Java-Modul stammen, mit einer einzigen Zeile zur Verfügung stellen.

Die Syntax

Schauen wir auf ein konstruiertes Beispiel. Bis Java 24 sieht das so aus.

import java.time.LocalDate;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;

public class OrderReportService {
    public List<String> loadOrderIds(Path file) throws IOException {
        return Files.readAllLines(file);
    }

    public Map<LocalDate, List<String>> groupByDate(List<String> orders) {
        return orders.stream()
                .collect(Collectors.groupingBy(o -> LocalDate.now()));
    }
}

Jetzt Java 25, mit Module Import:

import module java.base;

public class OrderReportService {
    public List<String> loadOrderIds(Path file) throws IOException {
        return Files.readAllLines(file);
    }

    public Map<LocalDate, List<String>> groupByDate(List<String> orders) {
        return orders.stream()
                .collect(Collectors.groupingBy(o -> LocalDate.now()));
    }
}

Aus sieben Zeilen für die Imports von Klassen aus verschiedenen Paketen wird nun eine einzige Zeile, mit der alles aus dem Modul java.base importiert wird!

Das ist ein ausgezeichnetes Beispiel, um den Vorteil dieses neuen Features zu zeigen!

Nein, ist es nicht.

Meine IDE macht das doch eh schon

In einer modernen IDE ist das Problem bereits seit langem gelöst. Auto-Import schreibt die Zeilen, eingeklappter import-Block blendet sie aus, und Organize Imports entfernt die, die überflüssig geworden sind. Ob dort zehn Einzelimports stehen oder eine Zeile import module java.base, spielt praktisch keine Rolle.

Die eigentlichen Vorteile zeigen sich außerhalb der IDE.

In der Ausbildung und beim Einstieg in Java zählt die Lesbarkeit des Codes selbst mehr als IDE-Komfort. Einsteiger müssen sich nicht merken, in welchem Package List oder LocalDate liegen. Eine Zeile import module java.base; genügt.

Mit Compact Source Files (ebenfalls mit Java 25 dazugekommen) lassen sich kurze Programme für einfache Aufgaben erstellen, die ohne Klassendeklarationen auskommen. Dort ist import module java.base sogar implizit bereits enthalten, man schreibt also oft gar keine Imports mehr.

Diffs über Zeit

Das ist ein Codeausschnitt aus einer typischen Anwendung:

// Ohne import module
import java.util.List;
import java.util.Map;

public class InvoiceService {
    public List<Invoice> findOpen() { ... }
}

Ein halbes Jahr später fügt eine Entwicklerin in einem Commit eine Methode hinzu, die erstmals Optional nutzt.

Das Diff enthält die neue Import-Zeile plus die eigentliche Code-Änderung.

+ import java.util.Optional;
  ...
+ public Optional<Invoice> findLatest() { ... }

Schauen wir auf dasselbe Szenario, diesmal mit Module Import:

// Mit import module
import module java.base;

public class InvoiceService {
    public List<Invoice> findOpen() { ... }
}

Nach der Änderung steht im Diff nur die eine Code-Zeile.

+ public Optional<Invoice> findLatest() { ... }

Es ist kein import-Diff nötig, weil Optional schon über den Modulimport abgedeckt ist.

import module diff over time v2

Der Nutzen zeigt sich also nicht beim einmaligen Schreiben, sondern kumulativ bei jedem späteren Commit, der einen neuen java.base-Typ einführt. Nicht „7 Zeilen werden 1 Zeile beim ersten Schreiben“, sondern „null zusätzliche Import-Diffs über die Lebensdauer der Datei, sooft neue java.base-Typen dazukommen“. Das ist sichtbar in PR-Reviews, git diff, oder GitHub-Weboberfläche ohne Folding.

Der Enterprise-Haken

Es gibt eine wichtige Einschränkung: import module funktioniert nicht für Code auf dem Classpath.

Die Anweisung erwartet einen Modulnamen, Classpath-Code besitzt jedoch keinen und kann daher nicht mit import module importiert werden.

Frameworks wie Spring Boot, Quarkus und die meisten Jakarta-EE-Runtimes leben aber eben genau dort. Die FatJars, UberJars, Extensions liegen alle im Classpath.

Das bedeutet: org.springframework.*, jakarta.persistence.*, io.quarkus.* funktioniert nicht mit import module, diese Imports müssen weiterhin explizit deklariert werden.

import module java.base;  // ✅ funktioniert überall

import module org.springframework;  // ❌ Compilerfehler, unnamed module

Der praktische Nutzen bleibt auf JDK-eigene Module beschränkt – der interessante Teil (Framework- und Fachcode) profitiert nicht.

Fazit

Module Import Declarations ist kein Game Changer. Es räumt den Quarkus- oder Spring-Boot-Code nicht magisch auf. Der praktische Nutzen beschränkt sich weitgehend auf JDK-eigene APIs wie java.base, java.sql oder java.net.http, und dieses Problem lösen moderne IDEs ohnehin schon seit Jahren.

Wirklich interessant wird es für Compact Source Files, die JShell, Lernmaterial, Code-Reviews und allgemein Situationen außerhalb der IDE.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Bitte füllen Sie dieses Feld aus.
Bitte füllen Sie dieses Feld aus.
Bitte gib eine gültige E-Mail-Adresse ein.
Sie müssen den Bedingungen zustimmen, um fortzufahren.

Autor

Diesen Artikel teilen

LinkedIn
Xing

Gibt es noch Fragen?

Fragen beantworten wir sehr gerne! Schreibe uns einfach per Kontaktformular.

Kurse

weitere Blogbeiträge

Work Life Balance. Jobs bei Gedoplan

We are looking for you!

Lust bei GEDOPLAN mitzuarbeiten? Wir suchen immer Verstärkung – egal ob Entwickler, Dozent, Trainerberater oder für unser IT-Marketing! Schau doch einfach mal auf unsere Jobseiten! Wir freuen uns auf Dich!

Work Life Balance. Jobs bei Gedoplan

We are looking for you!

Lust bei GEDOPLAN mitzuarbeiten? Wir suchen immer Verstärkung – egal ob Entwickler, Dozent, Trainerberater oder für unser IT-Marketing! Schau doch einfach mal auf unsere Jobseiten! Wir freuen uns auf Dich!