Lors de l'utilisation de la classe Java 8 Optional
, une valeur peut être encapsulée dans une valeur facultative.
String foobar = <value or null>;
Optional.of(foobar); // May throw NullPointerException
Optional.ofNullable(foobar); // Safe from NullPointerException
Je comprends que Optional.ofNullable
est le seul moyen sûr d’utiliser Optional
, mais pourquoi Optional.of
existe-t-il? Pourquoi ne pas simplement utiliser Optional.ofNullable
et rester prudent en tout temps?
Votre question est basée sur l'hypothèse que le code qui peut renvoyer NullPointerException
est pire que le code qui peut ne pas l'être. Cette hypothèse est fausse. Si vous vous attendez à ce que votre foobar
ne soit jamais nulle en raison de la logique du programme, il est préférable d'utiliser Optional.of(foobar)
car vous verrez apparaître un NullPointerException
qui indiquera que votre programme a un bogue. Si vous utilisez Optional.ofNullable(foobar)
et que la foobar
se trouve être null
en raison du bogue, votre programme continuera alors de fonctionner de manière incorrecte, ce qui peut constituer un plus grand désastre. De cette façon, une erreur peut se produire beaucoup plus tard et il serait beaucoup plus difficile de comprendre à quel point cela a mal tourné.
De plus, si vous savez que votre code ne devrait pas fonctionner si object est null, vous pouvez générer une exception en utilisant Optional.orElseThrow
String nullName = null;
String name = Optional.ofNullable(nullName).orElseThrow(NullPointerException::new);
@ tagir-valeev , Merci de corriger si je me trompe.
Cela dépend entièrement des scénarios. La classe facultative a un constructeur privé et nous ne pouvons donc pas créer d’objet avec un nouveau mot-clé. En fonction des besoins, nous pouvons utiliser l'un des procédés
En résumé, nous pouvons dire que si vous êtes sûr que la valeur n'est pas nulle, vous pouvez utiliser of () et si vous pensez que la valeur peut être nulle, vous devez utiliser ofNullable ()
Pour plus de détails, vous pouvez consulter comment créer un objet option dans Java 8
Facultatif devrait principalement être utilisé pour les résultats des services de toute façon. Dans le service, vous savez ce que vous avez sous la main et vous renvoyez Optional.of (someValue) si vous avez un résultat et vous renvoyez Optional.empty () si vous n'en avez pas. Dans ce cas, certaines valeurs ne doivent jamais être nulles et, néanmoins, vous renvoyez un facultatif.
Cela dépend des scénarios.
Supposons que vous disposiez de certaines fonctionnalités métier et que vous deviez traiter quelque chose avec cette valeur davantage, mais avoir la valeur null
au moment du traitement aurait un impact sur celle-ci.
Ensuite, dans ce cas, vous pouvez utiliser Optional<?>
.
String nullName = null;
String name = Optional.ofNullable(nullName)
.map(<doSomething>)
.orElse("Default value in case of null");