Java 10 – Die Änderungen an den Klassenbibliotheken

Mit Java 10 gab es neben dem größeren Update der Local-Variable Type Inference auch noch einige kleinere Änderungen an den Klassenbibliotheken. Hier eine Übersicht über die wichtigsten Änderungen an den Klassenbibliotheken.

Einige dieser Änderungen werden hier beschrieben. Um alle Änderungen zwischen den JDK-Versionen auf einen Blick zu sehen, wird auch an dieser Stelle wieder das JDK-API-Diff Tool empfohlen.

Collection

Zunächst zu den APIs zur Erstellung nicht-modifizierbarer Collections. Hier gibt es einige neue Methoden, um defensive Kopien von Sets, Listen und Maps zu erstellen. Diese Kopien sind anschließend unveränderbar. Hintergründe zu diesen neuen Kopiermethoden sind in der Oracle Bug Database zu finden.

Set<String> set = new HashSet<>();
set.addAll(Set.of("Dies", "ist", "ein", "Test"));
Set<String> set2 = Set.copyOf(set);
System.out.println(set.getClass().getName());
System.out.println(set2.getClass().getName());

Für unser Beispiel erstellen wir zunächst ein Set mit Strings und fügen einige Beispielstrings ein. Wichtig ist hier, die Einträge mit set.addAll(...) hinzuzufügen, anstatt einfach Set.of (...) zu verwenden. Set.of(...) gibt nämlich bereits ein nicht-modifizierbares Set zurück. In einem älteren Blogartikel hatten wir bereits über die mit Java 9 eingeführten Factory-Methoden für Sets, Listen und Maps berichtet.
In unserem Beispiel wird anschließend die neue copyOf(...)-Methode aufgerufen. Diese gibt dann ein Objekt vom Typ ImmutableSet.SetN zurück.

Die Ausgabe des Programms lautet somit:
java.util.HashSet
java.util.ImmutableCollections$SetN

Analog dazu gibt es auch Kopiermethoden für die Klassen List und Map, welche ebenfalls unveränderbare Kopien des jeweiligen List– oder Map-Objektes zurückliefern.

Streams

Bei den Streams gibt es einige kleinere Änderungen in Bezug auf die Collectors. Auch diese haben mit nicht-modifizierbaren Collections zu tun. Es gibt nämlich nun die neuen Collectors Collectors.toUnmodifiableList(), Collectors.toUnmodifiableSet() und Collectors.toUnmodifiableMap().

Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);
List<Integer> list = stream.collect(Collectors.toList());
List<Integer> list2 = stream.collect(Collectors.toUnmodifiableList());
System.out.println(list.getClass().getName());
System.out.println(list2.getClass().getName());

Wie aus dem Code hervorgeht, wird zunächst ein Stream mit den Integern eins bis fünf erzeugt. Dieser wird einmal mit dem alten, bereits bekannten toList()-Collector eingesammelt und einmal mit dem neuen Collector toUnmodifiableList()-Collector. Die Ausgabe des Programms lautet:
java.util.ArrayList
java.util.ImmutableCollections$ListN

Der Rückgabetyp der toList()-Methode ist also wie zu erwarten ArrayList, während der Rückgabetyp der toUnmodifiableList()-Methode eine ImmutableCollecion.ListN ist. Diese ist, wie der Name bereits impliziert, unveränderbar.

Optional

Bei der Klasse Optional wurde eine neue Methode Optional.orElseThrow() hinzugefügt, welche synonym zur bereits bekannten Optional.get()-Methode zu verwenden ist. In der JavaDoc wird sie jedoch als zu bevorzugende Methode zu get() markiert. Hintergrund dieser Nuance ist, dass möglicherweise nicht alle Java-Entwickler bei dem Aufruf einer get()-Methode eine Exception erwarten. Insbesondere bei der Klasse Optional kann diese jedoch häufiger auftreten. Die Methode orElseThrow() enthält dagegen eine weitaus stärkere Formulierung und impliziert, dass es zu einer Exception kommen kann.

Sonstiges

Neben den Änderungen an Collections, Streams und der Klasse Optional wurde außerdem der G1 Garbage Collector verfeinert. Konkret wurde die Performance einer Full Garbage Collection durch das Hinzufügen einer Funktion zur effizienten Parallelisierung der Garbage Collection gesteigert. Dieses Feature hat im Vergleich zum alten Standardgarbagecollector, dem Parallel GC, noch gefehlt. Außerdem wurden einige standardmäßige Zertifizierungsstellen eingefügt, sowie einige weitere Änderungen vorgenommen.

All diese Änderungen sind in den offiziellen Java 10 Release Notes auf der Oracle Website noch einmal weiterführend erklärt.

Short URL for this post: https://wp.me/p4nxik-36M
This entry was posted in Java Basics and tagged , , , , . Bookmark the permalink.

Leave a Reply