Bei Verwendung der Java 8- Optional
Klasse gibt es zwei Möglichkeiten, wie ein Wert in eine Option eingeschlossen werden kann.
String foobar = <value or null>;
Optional.of(foobar); // May throw NullPointerException
Optional.ofNullable(foobar); // Safe from NullPointerException
Ich verstehe, dass dies Optional.ofNullable
die einzig sichere Art der Verwendung ist Optional
, aber warum gibt Optional.of
es sie überhaupt? Warum nicht einfach Optional.ofNullable
immer auf der sicheren Seite sein?
java.util.Optional
- Es ist verfügbar, wenn Sie JDK 8 oder höher verwendenofNullable()
benanntof()
undof()
benannt hättenofNotNull()
Antworten:
Ihre Frage basiert auf der Annahme, dass der Code, der möglicherweise ausgelöst
NullPointerException
wird, schlechter ist als der Code, der möglicherweise nicht ausgelöst wird. Diese Annahme ist falsch. Wenn Sie erwarten, dass Ihrfoobar
Programm aufgrund der Programmlogik niemals null ist, ist es viel besser, es zu verwenden,Optional.of(foobar)
da Sie ein Symbol sehen,NullPointerException
das anzeigt, dass Ihr Programm einen Fehler aufweist. Wenn Sie verwendenOptional.ofNullable(foobar)
und dasfoobar
zufällig aufnull
den Fehler zurückzuführen ist, arbeitet Ihr Programm stillschweigend weiterhin falsch, was eine größere Katastrophe sein kann. Auf diese Weise kann ein Fehler viel später auftreten und es wäre viel schwieriger zu verstehen, an welchem Punkt er schief gelaufen ist.quelle
Optional.of(foobar)
" Dies scheint ein bisschen seltsam zu sein - wenn wir wissen, dass der Wertnull
auf keinen Fall sein wird, warum dann nicht den Wert selbst verwenden, anstatt ihn in einen zu verpackenOptional
?Optional
die Methode von der Methode zurückgeben, die für die von Ihnen implementierte Schnittstelle erforderlich ist (wahrscheinlich geben andere Implementierer eine leere Option zurück). Oder Sie möchten eine Sammlung / einen Stream von Optionen erstellen, von denen einige garantiert nicht null sind und andere nicht. Oder Sie haben eine bedingte Logik, die eine Option in mehreren Zweigen erstellt, und in einem einzelnen Zweig sind Sie sicher, dass sie nicht null ist.null
bedeutet in diesem Fall "Ich erwarte, dass foobar vorhanden ist, aber aufgrund eines Fehlers ist es null".Optional.isPresent() == false
bedeutet, dass foobar nicht vorhanden ist, dh dies ist zu erwarten, legitimes Verhalten.return list.isEmpty()? Optional.empty(): Optional.of(list.get(0));
dielist
voraussichtlich nie enthaltennull
Werte ...Wenn Sie wissen, dass Ihr Code nicht funktionieren sollte, wenn das Objekt null ist, können Sie mithilfe von eine Ausnahme auslösen
Optional.orElseThrow
quelle
String name = Objects.requireNonNull(nullName);
NullPointerException
wenn das Problem eindeutig eine Referenz ist,null
die es nicht sein sollte, wäre ein Schritt in die falsche Richtung.new NullNameException("meaningful msg")
Dies hängt von den Szenarien ab.
Angenommen, Sie verfügen über einige Geschäftsfunktionen und müssen etwas mit diesem Wert weiter verarbeiten, aber ein
null
Wert zum Zeitpunkt der Verarbeitung würde sich darauf auswirken.In diesem Fall können Sie dann verwenden
Optional<?>
.quelle
Optional sollte ohnehin hauptsächlich für Ergebnisse von Diensten verwendet werden. Im Service wissen Sie, was Sie zur Hand haben, und geben Optional.of (someValue) zurück, wenn Sie ein Ergebnis haben, und geben Optional.empty () zurück, wenn Sie dies nicht tun. In diesem Fall sollte ein Wert niemals null sein, und dennoch geben Sie eine Option zurück.
quelle