Manche nützliche Erweiterung in der Standard Java Bibliothek entdeckt man erst, wenn man in der API nach etwas gänzlich anderem sucht. Die NULL
Wertebehandlung in der Klasse Objects
hat seit Java 9 Zuwachs erhalten. Neben dem Objects.requireNonNull
existieren nun auch Objects.requireNonNullElse
und Objects.requireNonNullElseGet
.
In der Vergangenheit mussten häufig Guard Clauses verwendet werden, um Parameter auf ihren Wertebereich zu prüfen oder ggf. einen Default-Wert zu verwenden.
String secret(Integer value) { Integer currentValue = value; if (currentValue == null) { currentValue = 23; } return hiddenSecret(value); }
Die beiden neuen Methoden gestatten eine einfache Ersetzung von NULL
Werten durch einen Default-Wert. Durch ihren Einsatz vereinfacht sich der eigene Code.
String secret(Integer value) { return hiddenSecret(requireNonNullElse(value, 23)); }
Die requireNonNullElse
Methode kann direkt auf den Parameter des hiddenSecret
Aufrufes angewendet werden. Dadurch reduziert sich die Methode auf einen Einzeiler. Selbstverständlich hätte das Beispiel auch mit Hilfe eines ternären Operators vereinfacht werden können.
String secret(Integer value) { return hiddenSecret(value == null ? 23 : value); }
Diese Form ist aber weniger gut zu lesen und sollte deshalb nicht verwendet werden.
Ist die Erzeugung des Default-Wertes aufwendig, so bietet sich die requireNonNullElseGet
Methode an, die einen Supplier
für den Default-Wert erwartet.
String secret(Illuminatus value) { Illuminatus currentValue = value; if (currentValue == null) { currentValue = new Illuminatus(); } return hiddenSecret(value); }
Durch den Einsatz der requireNonNullElseGet
Methode kann auch diese Methode vereinfacht werden.
String secret (Illuminatus value) { return hiddenSecret(requireNonNullElseGet(value, Anonymous::new)); }
Hier wird die Illuminatus
Instanz erst erzeugt, wenn der Parameter tatsächlich null
ist. Alternativ gab es bislang nur die Verwendung eines etwas teureren Optional
an dieser Stelle.
String secret(Illuminatus value) { return hiddenSecret(Optional.ofNullable(value).orElseGet(Anonymous::new)); }
Einziges bislang bekanntes Manko der beiden neuen Methoden ist die Länge ihre Namens.