Defaultwerte für NULL Parameter

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.