Test the best

Best of Java 10: API-Neuerungen – Erweiterung in der Klasse Optional

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. Dieses Mal stelle ich eine kleine, aber feine Erweiterung in der Klasse java.util.Optional<T> vor.

Erweiterung in der Klasse Optional<T>

Die Klasse java.util.Optional<T> war eine enorme Bereicherung des JDKs in Java 8, um endlich sauber optionale Werte, vor allem für Rückgaben modellieren zu können. Ob es auch zur Definition von Attributen genutzt werden sollte, oder nicht, ist in der Entwicklergemeinde umstritten. Laut Oracle soll es nur für Rückgaben zum Einsatz kommen. Mit Java 9 wurde das API durch die drei Methoden ifPresentOrElse(), or() und stream() vervollständigt. Damit schien das API recht komplett. Allerdings hat man sich bei Oracle an einer Unschönheit gestört: an der Methode get(). Wieso?

Die Antwort ist recht einfach: Die Methode get() zum Zugriff auf den Wert eines Optional<T> sieht so harmlos aus, dass in der Praxis mitunter get() ohne vorherige Prüfung auf Existenz eines Werts mit isPresent() erfolgt. Das führt dann aber bei einem nicht vorhandenen Wert zu einer NoSuchElementException. Normalerweise erwartet man von einer get()-Methode allerdings nicht unbedingt, dass diese eine Exception auslöst. Um diesen Sachverhalt im API direkt auszudrücken, wurde die Methode orElseThrow() als Alternative zu get() in das JDK aufgenommen, die bei Vorhandensein den Wert liefert und ansonsten eben eine NoSuchElementException auslöst. Das gilt ebenso für die Spezialisierungen von Optional<T> für die primitiven Typen double, int und long.

Experimentieren wir in der JShell, um die Neuerungen in Optional<T> kennenzulernen:

jshell> Optional<String> optValue = Optional.of("ABC");
optValue ==> Optional[ABC]

jshell> String value = optValue.orElseThrow();        
value ==> "ABC"

jshell> System.out.println("Optional: " + value);
Optional: ABC

jshell> Optional<String> empty = Optional.empty();
empty ==> Optional.empty

jshell> empty.orElseThrow();
	java.util.NoSuchElementException thrown: No value present
		at Optional.orElseThrow (Optional.java:371)
		at (#11:1)

PRAXISTIPP: Kleinere Experimente mit der JShell

In der Beschreibung der JShell in meinem Buch „Java 9 – Die Neuerungen“ habe ich zum Teil etwas kritisch auf die JShell geschaut. Ein Vorteil davon ist jedoch, dass man kleine Programmschnipsel direkt ausprobieren kann. Für Beispiele und Demonstration kann das praktisch sein, weil man hier auf eine main()-Methode verzichten kann. So uneingeschränkt positiv gilt das allerdings nur, wenn man Dinge aus dem Modul java.base nutzt. Ansonsten ist in der Regel ein zusätzlicher Import in der JShell notwendig. Da muss man schon recht genau wissen, aus welchem Package eine Klasse stammt. Bereits hier profitiert man von den Hilfen einer IDE.

Im nächsten (und letzten) Teil der Serie geht es um die Modifikationen in der Versionierung von Java und einige kleinere Neuerungen, die Java 10 mit sich brachte.

W-JAX 2018 Java-Dossier für Software-Architekten

Kostenlos: 40+ Seiten Java-Wissen von Experten

Sie finden Artikel zu Enterprise Java, Software-Architektur, Agilität, Java 11, Deep Learning und Docker von Experten wie Kai Tödter (Siemens), Arne Limburg (Open Knowledge), Manfred Steyer (SOFTWAREarchitekt.at) und vielen weiteren.

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

Hinterlasse den ersten Kommentar!

avatar
400
  Subscribe  
Benachrichtige mich zu: