Test the best

Best of Java 10: Versionierung & kleinere neue Features

Michael Inden

© Shutterstock / Profit_Image

Nur rund sechs Monate nach dem Erscheinen des umfangreichen und bedeutsamen Updates Java 9 erblickte Java 10 im März 2018 das Licht der Welt. Da Java 11 gerade erschienen ist, ergreift Michael Inden die Gelegenheit und wirft in dieser Artikelserie einen Blick auf die wichtigsten Features des Vorgängers.

Michael Inden hat bereits die Highlights von Java 9 in seiner Artikelserie Java 9 – Eine Einführung vorgestellt. Die vorliegende Artikelserie setzt sich aus Texten zusammen, die auch in seinem neuen Buch zu Java 10/11, das beim dpunkt.verlag erscheinen wird.

Im ersten Teil der Serie ging es um die Syntax-Erweiterungen in Java 10. Im zweiten Teil ging ich auf das Erzeugen unveränderlicher Kopien von Listen, Sets und Maps ein. Außerdem zeigte ich eine Erweiterung im Stream API bei den Kollektoren, die nun ebenfalls unveränderliche Ergebnisdatenstrukturen liefern können. Im dritten Teil stellte ich eine kleine, aber feine Erweiterung in der Klasse java.util.Optional<T> vor. Im vorliegenden letzten Teil geht es um die Modifikationen in der Versionierung von Java und kleinere neue Features.

Modifikationen in der Versionierung

Nachdem mit Java 9 endlich ein sinnvolles, nachvollziehbares Versionsschema und die unterstützende Klasse java.lang.Runtime.Version eingeführt wurde, ist das Ganze aufgrund einer geänderten Release-Politik von Oracle leider mit Java 10 bereits teilweise über den Haufen geworfen worden. Man spricht nun nicht mehr von Major- und Minor-Version sowie Security-Patch mit dem Format MAJOR.MINOR.SECURITY, sondern von Feature, Interim, Update und Patch mit dem Format FEATURE.INTERIM.UPDATE.PATCH. Deswegen sind die Methoden major(), minor() und security() seit Java 10 „deprecated“ und rufen die Methoden feature() bzw. interim() sowie update() auf.

Betrachten wir ein Beispiel zur Demonstration der Neuerungen:

var version = Runtime.version();
System.out.println(version);
System.out.println("Major: " + version.major());
System.out.println("Minor: " + version.minor());
System.out.println("Security: " + version.security());
System.out.println("Feature: " + version.feature());
System.out.println("Interim: " + version.interim());
System.out.println("Update: " + version.update());
System.out.println("Patch " + version.patch());
System.out.println("Build: " + version.build());

Als Ausgabe erhält man Folgendes:

10.0.2+13
Major: 10
Minor: 0
Security: 2
Feature: 10
Interim: 0
Update: 2
Patch: 0
Build: Optional[13]

Kleinere Neuerungen in Java 10

In verschiedenen weiteren Bereichen des JDKs gibt es einige kleinere Neuerungen. Einige dieser Änderungen sind jedoch eher selten für uns als Applikationsentwickler von Interesse. Zwei potenziell recht Interessante sind Folgende.

„transferTo(Writer)“

Long transferTo(Writer) aus der Klasse java.io.Reader: Es werden alle Zeichen aus dem Reader in den übergebenen Writer übertragen – diese Funktionalität existiert analog in der Klasse InputStream bereits seit Java 9.

var sr = new StringReader("Hello");
var sw = new StringWriter();

sr.transferTo(sw);

System.out.println("SW: " + sw.toString());

Kopieren Sie diese Zeilen in die JShell oder betten Sie diese in eine main()-Methode ein, um folgende Ausgabe zu erhalten:

SW: Hello

„toString(Charset)“

String toString(Charset) aus der Klasse java.io.ByteArrayOutputStream: Das ist eine überladene Variante der toString()-Methode, die das übergebene Charset verwendet.

var values = new byte[]{65, 66, 67, 68};
var is = new ByteArrayInputStream(values);
var bos = new ByteArrayOutputStream();

is.transferTo(bos);

System.out.println(bos.toString());
System.out.println(bos.toString(StandardCharsets.UTF_16));

Auch hier könnte man die JShell nutzen (siehe Anmerkungen unten). Mit einer main()-Methode ist man aber vermutlich schneller am Ziel folgender Ausgaben:

ABCD
䅂䍄
PRAXISTIPP: Imports in der JShell

Zum Ausprobieren in der JShell muss – wie schon in einem vorherigen Praxistipp angedeutet – ein passender Import erfolgen:

jshell> import java.nio.charset.*;

Das ist nötig, weil die im Beispiel zur Angabe der Zeichensatzkodierung verwendete Klasse StandardCharsets nicht im Modul java.base vorhanden ist.

Fazit

Java 10 war ein eher kosmetisches Release und hätte meines Erachtens auch genauso gut 9.1 oder 9.2 genannt werden können. Die neue Release-Politik von Oracle ist diskussionswürdig: Änderungen schneller veröffentlichen zu können, ist sicher positiv. Jedoch dafür immer die Major-Version hochzuzählen, gleichzeitig aber kaum relevante Neuerungen zu integrieren, kann man in Frage stellen.

Aber rekapitulieren wir nochmals die wesentlichen Features aus Java 10:

  • orElseThrow(): Diese Methode sorgt für ein klareres API von Optional<T> und löst eine NoSuchElementException aus, sofern kein Element vorhanden ist.
  • copyOf() und toUnmodifiableList/Set/Map(): copyOf(): Diese Methoden dienen zum Kopieren von Listen, Sets und Maps bzw. zum Bereitstellen unveränderlicher Kopien davon.
  • var: Hiermit ist es für lokale Variablen möglich, auf die konkrete Typangabe zu verzichten. Dadurch wird der Quellcode etwas kürzer, vor allem, wenn man Variablen mit viel Generics nutzt.
PRAXISTIPP: Dies und Das

Schließlich möchte ich noch folgende Dinge erwähnen: Die mit Java 9 eingeführte JShell besaß recht lange Startup- und Tear-Down-Zeiten, was dem Gedanken des schnellen Ausprobierens doch im Weg stand. Mit Java 10 erfolgen der Start und auch das Beenden der JShell schneller. Zudem ist die JVM seit Java 10 „Docker aware“. Das bedeutet, dass die JVM nun erkennt, wenn sie in einem Docker-Container läuft. Dadurch werden spezifische Informationen wie die Anzahl an CPUs, RAM usw. nicht mehr vom Betriebssystem, sondern vom Docker-Container ermittelt.

Verwandte Themen:

Geschrieben von
Michael Inden
Michael Inden
Dipl.-Inform. Michael Inden ist Oracle-zertifizierter Java-Entwickler für JDK 6. Nach seinem Studium in Oldenburg war er lange Zeit als Softwareentwickler und -architekt bei verschiedenen internationalen Firmen tätig und arbeitet derzeit als Teamleiter Softwareentwicklung in Zürich. Michael Inden hat rund 20 Jahre Erfahrung beim Entwurf komplexer Softwaresysteme gesammelt, an diversen Fortbildungen und an mehreren Java-One-Konferenzen in San Francisco teilgenommen. Sein Wissen gibt er gerne als Trainer in Schulungen und auf Konferenzen weiter. Sein besonderes Interesse gilt dem Design qualitativ hochwertiger Applikationen mit ergonomischen, grafischen Oberflächen sowie dem Coaching von Kollegen.
Kommentare

Hinterlasse einen Kommentar

2 Kommentare auf "Best of Java 10: Versionierung & kleinere neue Features"

avatar
400
  Subscribe  
Benachrichtige mich zu:
S.+Waldmann
Gast

Die Einleitung ist nicht mehr ganz aktuell: „…da Java 11 bereits vor der Türe steht…“.
Java 11 ist bereits seit fast 2 Wochen öffentlich verfügbar.

Dominik Mohilo
Mitglied

Hallo lieber S. Waldmann,

vielen Dank für den Hinweis, wir haben die Einleitung angepasst 😉

Liebe Grüße,
Dominik