Java im Jahr 2025: Was gibt es Neues? Ein Überblick in der Praxis
Java entwickelt sich weiterhin aktiv weiter, und das Jahr 2025 bildet hier keine Ausnahme. Die Releases von JDK 23 und 24 brachten lang erwartete Stabilisierungen experimenteller Funktionen sowie mehrere völlig neue Möglichkeiten, die die Herangehensweise an das Schreiben von Code grundlegend verändern. In diesem Artikel analysieren wir die wichtigsten Neuerungen anhand praktischer Beispiele, damit Sie sie sofort in Ihren Projekten anwenden können. Wir betrachten virtuelle Threads (Project Loom), verbessertes Pattern Matching, neue Möglichkeiten von Record und Sealed Classes sowie Änderungen in der API.
1. Virtuelle Threads (Project Loom) — De-facto-Standard
Virtuelle Threads, die mit JDK 21 stabil wurden, haben sich im Jahr 2025 zum wichtigsten Werkzeug für hochlastige Serveranwendungen entwickelt. Sie ermöglichen die Erstellung von Millionen leichtgewichtiger Threads, ohne das Betriebssystem zu belasten. Der Hauptvorteil ist die Einfachheit: Der Code sieht synchron aus, funktioniert aber asynchron.
Beispiel: Hochlastiger HTTP-Client
Angenommen, Sie müssen 10.000 HTTP-Anfragen senden. Mit klassischen Threads würde dies einen OutOfMemoryError oder enorme Gemeinkosten verursachen. Mit virtuellen Threads wird die Aufgabe elegant gelöst:
import java.net.http.HttpClient;import java.net.http.HttpRequest;import java.net.http.HttpResponse;import java.net.URI;import java.util.concurrent.Executors;import java.util.stream.IntStream;
public class VirtualThreadsExample { public static void main(String[] args) throws Exception { var client = HttpClient.newHttpClient();
try (var executor = Executors.newVirtualThreadPerTaskExecutor()) { IntStream.range(0, 10_000).forEach(i -> { executor.submit(() -> { var request = HttpRequest.newBuilder() .uri(URI.create("https://httpbin.org/delay/1")) .build(); try { var response = client.send(request, HttpResponse.BodyHandlers.ofString()); System.out.println("Anfrage " + i + " abgeschlossen, Status: " + response.statusCode()); } catch (Exception e) { System.err.println("Fehler: " + e.getMessage()); } }); }); } // executor.close() wartet auf Abschluss aller Threads }}Was hat sich 2025 geändert? Die Integration mit Sockets und Datenbanken wurde verbessert. Jetzt arbeiten virtuelle Threads korrekt mit den meisten gängigen JDBC-Treibern (z. B. PostgreSQL), ohne dass diese modifiziert werden müssen. Außerdem besteht nun die Möglichkeit, benutzerdefinierte Planer (ForkJoinPool) für die Feinabstimmung der Leistung festzulegen.
2. Pattern Matching — finale Version und neue Muster
Pattern Matching für switch und instanceof hat 2025 die volle Reife erreicht. Die wichtigste Neuerung ist die Unterstützung von Record Patterns und Guarded Patterns (bedingte Muster). Dies ermöglicht das Schreiben von sehr prägnantem und sicherem Code für die Analyse komplexer Datenstrukturen.
Beispiel: Analyse einer JSON-ähnlichen Struktur
sealed interface Shape permits Circle, Rectangle, Triangle {}record Circle(double radius) implements Shape {}record Rectangle(double width, double height) implements Shape {}record Triangle(double base, double height) implements Shape {}
public class PatternMatchingExample { public static double calculateArea(Shape shape) { return switch (shape) { case Circle c -> Math.PI * c.radius() * c.radius(); case Rectangle r -> r.width() * r.height(); // Guarded pattern: Prüft, ob das Dreieck nicht entartet ist case Triangle t when t.base() > 0 && t.height() > 0 -> 0.5 * t.base() * t.height()