Lorsque vous utilisez la Optional
classe Java 8 , il existe deux façons dont une valeur peut être encapsulée dans une option.
String foobar = <value or null>;
Optional.of(foobar); // May throw NullPointerException
Optional.ofNullable(foobar); // Safe from NullPointerException
Je comprends que Optional.ofNullable
c'est le seul moyen sûr d'utiliser Optional
, mais pourquoi Optional.of
existe- t- il? Pourquoi ne pas simplement utiliser Optional.ofNullable
et être en sécurité en tout temps?
java.util.Optional
- Il est disponible si vous utilisez JDK 8 ou version ultérieureofNullable()
nomméof()
etof()
nomméofNotNull()
Réponses:
Votre question est basée sur l'hypothèse que le code qui peut être lancé
NullPointerException
est pire que le code qui ne l'est pas. Cette hypothèse est fausse. Si vous vous attendez à ce que votrefoobar
ne soit jamais nul en raison de la logique du programme, il est préférable de l'utiliserOptional.of(foobar)
car vous verrez unNullPointerException
qui indiquera que votre programme a un bogue. Si vous utilisezOptional.ofNullable(foobar)
et quefoobar
cela estnull
dû au bogue, votre programme continuera silencieusement à fonctionner incorrectement, ce qui peut être un plus gros désastre. De cette façon, une erreur peut se produire beaucoup plus tard et il serait beaucoup plus difficile de comprendre à quel moment elle a mal tourné.la source
Optional.of(foobar)
". Cela semble un peu étrange - quand nous savons que la valeur ne seranull
en aucun cas, alors pourquoi ne pas utiliser la valeur elle-même, au lieu de l'envelopper dans unOptional
?Optional
de la méthode comme requis par l'interface que vous implémentez (probablement d'autres implémenteurs peuvent retourner une option vide). Ou vous souhaitez créer une collection / flux d'options, dont certains sont garantis non nuls et d'autres non. Ou vous avez une logique conditionnelle qui crée une option dans plusieurs branches et dans une seule branche, vous êtes sûr qu'elle n'est pas nulle.null
dans ce cas signifie "Je m'attends à ce que foobar soit présent, mais à cause d'un bug, il est nul".Optional.isPresent() == false
signifie que foobar n'est pas présent, c'est-à-dire qu'il s'agit d'un comportement légitime attendu.return list.isEmpty()? Optional.empty(): Optional.of(list.get(0));
lelist
ne devrait jamais contenir denull
valeurs…De plus, si vous savez que votre code ne devrait pas fonctionner si l'objet est nul, vous pouvez lever l'exception en utilisant
Optional.orElseThrow
la source
String name = Objects.requireNonNull(nullName);
NullPointerException
lorsque le problème est clairement une référencenull
alors qu'il ne devrait pas, serait un pas dans la mauvaise direction.new NullNameException("meaningful msg")
Cela dépend des scénarios.
Supposons que vous ayez des fonctionnalités métier et que vous ayez besoin de traiter quelque chose avec cette valeur, mais que la
null
valeur au moment du traitement ait un impact.Ensuite, dans ce cas, vous pouvez utiliser
Optional<?>
.la source
Facultatif doit être utilisé principalement pour les résultats des services de toute façon. Dans le service, vous savez ce que vous avez sous la main et retournez Optional.of (someValue) si vous avez un résultat et retournez Optional.empty () si vous n'en avez pas. Dans ce cas, une valeur ne doit jamais être nulle et quand même, vous retournez un Facultatif.
la source