Kontakt

Wie dürfen wir Sie voranbringen?

Lassen Sie uns gemeinsam herausfinden, wie wir Sie unterstützen können. Wir freuen uns auf Ihre Anfrage.

 

Systecs Informationssysteme GmbH
+ 49 (0) 711 722 312-10
info@systecs.com

  •  

Java LTS Versionen: Die wichtigsten Neuerungen im Überblick

Daniel Lebert Daniel Lebert |
Lohnt sich ein Upgrade von Java 8 auf Java 11 oder 17 und welche Features sind besonders vorteilhaft.

Viele Projekte sind heutzutage noch auf dem Stand von Java 8, das 2014 veröffentlicht wurde. Seitdem hat sich vieles getan: Oracle hat das Lizenzmodell für Java geändert, wodurch viele Hersteller eigene JDK Versionen herausgebracht haben, der Releaserythmus wurde auf halbjährliche Releases umgestellt, wobei 11 und 17 Long-Term-Support Versionen darstellen (die nächste wird Java 21 sein). 

Auch wenn Oracle Java 8 laut aktuellem Stand noch bis 2030 mit Sicherheitsupdates versorgen wird, sollte ein Umstieg erwogen werden. In den neueren Releases wurden deutliche Performanceverbesserungen erzielt, insbesondere wenn Java in spezielleren Umgebungen eingesetzt wird. Ein weiterer wichtiger Grund für den Umstieg dürfte sein, dass Java 8 selbst zwar noch unterstützt wird, das Ökosystem und weit verbreitete Bibliotheken setzen aber schon seit einiger Zeit neuere Versionen voraus. 

Zudem sind in mittlerweile fast 10 Jahren viele neue Features dazugekommen. In diesem Artikel möchte ich die interessantesten beleuchten. Dies soll kein vollständiger Abriss aller neuesten Features sein, diesen kann man in den Releasenotes der einzelnen Versionen nachlesen.

Java 11

Java Plattform Module System

Durch das JPMS (auch Project Jigsaw genannt) können Java Anwendung zum einen modularisiert werden, zum anderen können durch den Entwickler die nach Außen exponierten Teile der Anwendung oder Bibliothek eingeschränkt werden. 

Jshell 

Die Jshell ist eine interaktive Programmierumgebung, um Java Code auszuführen. Sie eignet sich sehr gut, um Code-Fragmente zu testen.

Private interface methods 

Nachdem in Java 8 default Methoden in Interfaces eingeführt wurden, können diese nun auch mit private Methoden in Interfaces weiter untergliedert werden, sodass der Code verständlicher wird.

Local-Variable Type Inference

Dieses Feature fügt das var Keyword ein, durch das Java ermöglicht wird, den Typ einer Variablen zu erschließen, ohne dass er explizit angegeben werden muss. Dadurch lassen sich klassische Java-Ungetüme vereinfachen:

// vorher
YellowCarProviderFactory factory = new YellowCarProviderFactory();

// nachher
var factory = new YellowCarProviderFactory();

HTTP Client 

Es wurde ein neuer HTTP Client eingeführt, mit dem anhand einer schlanken API Aufrufe gemacht werden können: 

HttpClient httpClient = HttpClient.newBuilder() 
        .version(HttpClient.Version.HTTP_2)
        .connectTimeout(Duration.ofSeconds(20))
        .build();
HttpRequest httpRequest = HttpRequest.newBuilder()
        .GET()
        .uri(URI.create("http://localhost:8080"))
        .build();
HttpResponse<String> httpResponse = httpClient.send(httpRequest, HttpResponse.BodyHandlers.ofString());

Entfernen der Java EE und CORBA Module 

Diese Module wurden aus dem JDK entfernt und müssen als Abhängigkeiten bei Bedarf manuell eingebunden werden. Insbesondere betrifft dies die weitverbreiteten Bibliotheken JAXB und JAX-WS. 

Java 17

Switch Expressions

Mit switch expressions können Entwickler aus einem switch-Block einen Wert zurückgeben: 

String test = switch (direction) {
        case NORTH -> "north";
        case SOUTH -> "south";
        default -> {
                System.out.println("Unknown direction!"); yield "invalid";
        }
};

Darüber hinaus können mit switch expressions mehrere cases in einen Zweig zusammengefasst werden:

switch (direction) {
        case NORTH, WEST -> sailOn();
        case SOUTH, EAST -> turnBack();
};

Durch diese Änderungen wird der Code übersichtlicher, zudem sind sie als Vorbereitungen für zukünftige pattern matching Features zu verstehen.

Text Blocks

Textblöcke sind mehrzeilige Strings die ohne Escape-Sequenzen für Textumbrüche auskommen und die die angegebene Einrückung berücksichtigen.

String multiline = """
        ABC!
                DEF,
GHI.
""";
// Ausgabe:
        ABC!
                DEF,
GHI.

Helpful NullPointerExceptions

Javas altbekannte NullPointerExceptions werden durch diese Verbesserung um einiges hilfreicher, denn hier wird nun auch die Variable, die null ist, genannt.

Car car = null;

car.color = "blue";

// vorher:
Exception in thread "main" java.lang.NullPointerException
    at Main.main(Main.java:10)
// neu:
Exception in thread "main" java.lang.NullPointerException: Cannot assign field "color" because "car" is null
    at Main.main(Main.java:10)

Pattern Matching for instanceof

Durch dieses Feature wird das Casting nach einer instanceof-Prüfung gespart und der Code dadurch etwas sauberer.

Object test = "ABC";

if (test instanceof String string) {
        string.toLowerCase();
}

Records

Records sind eine Struktur, um unveränderliche Daten zusammenzufassen. Sie können als DTO Klassen Anwendung finden, deren getter wie gewohnt überschrieben werden können. Die Signatur der record-Klasse beinhaltet gleichzeitig alle nach außen sichtbaren Felder. 

record Car(String color, int wheels, int doors) {
        @Override
        public String color() {
                return "metallic-" + color;
        }
}

Car corsa = new Car("red", 4, 2);
corsa.color() // = metallic-red

Sealed Classes

Mit sealed Klassen und Interfaces kann festgelegt werden, welche Klassen von der sealed Klasse erben können. Hierbei kommt das neue permits Keyword zum Einsatz.

// nur Circle und Rectangle dürfen Shape erweitern
ublic sealed class Shape permits Circle, Rectangle {
}

// alle erbenden Klassen müssen entweder auch sealed, non-sealed oder final sein.
public non-sealed class Circle extends Shape {
}


public final class Rectangle extends Shape {
}

Ausblick

Die Punkte, die in diesem Abschnitt dargestellt werden, sind teilweise schon in nicht-LTS-Versionen veröffentlicht worden, weshalb man sicher sein kann, dass sie in der nächsten LTS-Version Java 21 enthalten sein werden. Zudem sind auch Features enthalten, die bisher nur als Preview verfügbar sind oder noch nur als Proposal vorliegen. Deswegen ist es hier kaum möglich konkrete Code-Beispiele zu zeigen und wo sie gezeigt werden, ist die Syntax bislang vorläufig.

UTF-8 by Default

Ab Java 18 ist UTF-8 das Standard-Charset. Zuvor war das Standard-Charset abhängig von der Umgebung, in der die Anwendung lief. Hierdurch sollen Operationen, die vom Charset beeinflusst werden, unabhängiger und nachvollziehbarer werden.

Simple Web Server

Ab Java 18 wird ein einfacher Webserver mitgeliefert, der statische Dateien bereitstellen kann. Hiermit soll das Testen vereinfacht werden.

Pattern Matching for switch

Die oben genannten Verbesserungen von Switch-Blöcken sollen noch weitergeführt werden. Es soll ermöglicht werden, die switch-Variable auf mehr als feste Werte zu vergleichen. Angedacht sind u.a. Vergleiche auf Typ, null-Wert, sowie spezifische Bedingungen (case String s when s.length() == 1).

Record Patterns

Die oben genannten Verbesserungen von instanceof-Vergleichen sollen record-Klassen in besonderer Weise unterstützen, offensichtlich angelehnt an das Object Destructuring von z.B. JavaScript:

record Point(int x, int y) {}

void printSum(Object o) {
        if (o instanceof Point(int x, int y)) {
                System.out.println(x+y);
        }
}

Value Types

Value Types sollen es Programmierern erlauben, eigene Value Objekte zu definieren, die sich analog zu primitiven Datentypen verhalten. Die Felder dieser Klassen sind immer final und zwei Instanzen sind genau dann gleich, wenn ihre Felder gleich sind. Diese Änderung soll es einfacher machen, leichtgewichtige Objekte zu definieren.

Virtual Threads

Bisher sind Java Threads ein 1-zu-1 Mapping zu OS-Threads. Dies limitiert die Anwendung, insbesondere wenn es sich um eine Server-Anwendung handelt, die jedem Request einen Thread zuweist. Virtual Threads, sollen deswegen das 1-zu-1 Mapping zu OS-Threads aufbrechen. Im Hintergrund sorgt die Java Runtime dafür, dass mit einem Virtual Thread nur dann ein OS-Thread besetzt wird, wenn auch tatsächlich Berechnungen ausgeführt werden.

Daniel LebertDaniel Lebert
Projektleiter
E-Mail: info@systecs.com

Datenschutz-Einstellungen

Um unsere Webseite für Sie optimal zu gestalten und fortlaufend zu verbessern, analysieren wir – mit Ihrer Zustimmung – die Nutzung unserer Webseite. Ebenso werden beim Abspielen von Videos – Ihre Zustimmung vorausgesetzt – Drittanbieter-Cookies von Youtube gesetzt.

  • Notwendige Cookies speichern z.B. den aktuellen Status Ihrer Datenschutz-Einstellung und sind erforderlich, damit diese Webseite ordnungsgemäß funktioniert.
  • Statistik Cookies sammeln anonym Informationen darüber, wie unsere Webseiten genutzt werden, um darauf basierend deren Attraktivität, Inhalt und Funktionalität zu verbessern.
  • Marketing Cookies werden von Drittanbietern wie YouTube gesetzt, um das Abspielen von Videos zu ermöglichen.   

Ihre Einwilligung können Sie jederzeit unter den Datenschutz-Einstellungen widerrufen. Weitere Informationen können Sie unserer Datenschutzerklärung entnehmen.