wake-up-neo.com

Warum verwenden Sie optional.of über optional.ofNullable?

Bei Verwendung der Java 8-Klasse Optional gibt es zwei Möglichkeiten, wie ein Wert in einen optionalen Wert eingeschlossen werden kann.

String foobar = <value or null>;
Optional.of(foobar);         // May throw NullPointerException
Optional.ofNullable(foobar); // Safe from NullPointerException

Ich verstehe, dass Optional.ofNullable der einzig sichere Weg ist, Optional zu verwenden, aber warum existiert Optional.of überhaupt? Warum nicht einfach Optional.ofNullable verwenden und immer auf der sicheren Seite sein?

178
whirlwin

Ihre Frage basiert auf der Annahme, dass der Code, der NullPointerException auslösen kann, schlechter ist als der Code, der möglicherweise nicht verwendet wird. Diese Annahme ist falsch. Wenn Sie davon ausgehen, dass Ihre foobar aufgrund der Programmlogik niemals null ist, ist es viel besser, Optional.of(foobar) zu verwenden, da Sie eine NullPointerException sehen, die darauf hinweist, dass Ihr Programm einen Fehler aufweist. Wenn Sie Optional.ofNullable(foobar) verwenden und die foobar aufgrund des Fehlers zufällig null ist, arbeitet Ihr Programm automatisch fehlerhaft weiter, was zu einem größeren Desaster führen kann. Auf diese Weise kann ein Fehler viel später auftreten und es wäre viel schwieriger zu verstehen, an welchem ​​Punkt der Fehler auftrat.

225
Tagir Valeev

Wenn Sie wissen, dass Ihr Code nicht funktionieren sollte, wenn das Objekt null ist, können Sie eine Ausnahme mit Optional.orElseThrow auslösen. 

String nullName = null;
String name = Optional.ofNullable(nullName).orElseThrow(NullPointerException::new);

@ tagir-valeev , Bitte korrigieren Sie, wenn ich falsch liege.

4
Karan Arora

Dies hängt vollständig von den Szenarien ab. Die optionale Klasse verfügt über einen privaten Konstruktor, sodass wir kein Objekt mit dem neuen Schlüsselwort erstellen können. Je nach Anforderung können wir die Methode verwenden

  • empty () : für Objekt ohne Wert, Insted using null können wir Optional.empty () verwenden
  • of (T-Wert) : create Optional für einen Wert: In dieser MethodeNullwert ist nicht zulässig.
  • ofNullable (T-Wert) : create Optional für einen Wert und ifWert kann null sein

Zusammenfassend können wir sagen, wenn Sie sicher sind, dass der Wert nicht null ist, können Sie of () verwenden, und wenn Sie glauben, dass der Wert null sein kann, müssen Sie ofNullable () verwenden.

Weitere Informationen finden Sie unter Erstellen von Optionsobjekten in Java 8

1
Rupesh Agrawal

Optional sollte ohnehin hauptsächlich für die Ergebnisse von Services verwendet werden. Im Service wissen Sie, was Sie zur Hand haben, und geben bei einem Ergebnis Optional.of (someValue) zurück. Wenn Sie dies nicht tun, geben Sie Optional.empty () zurück. In diesem Fall sollte ein Wert niemals null sein und Sie geben immer einen optionalen Wert zurück.

0
espendennis

Dies hängt von den jeweiligen Szenarien ab.

Angenommen, Sie haben einige Geschäftsfunktionen, und Sie müssen etwas mit diesem Wert weiter verarbeiten, aber wenn Sie zum Zeitpunkt der Verarbeitung den Wert null haben, hat dies Auswirkungen.

In diesem Fall können Sie dann Optional<?> verwenden.

String nullName = null;

String name = Optional.ofNullable(nullName)
                      .map(<doSomething>)
                      .orElse("Default value in case of null");
0