web-dev-qa-db-fra.com

Pourquoi utiliser Optional.of sur Optional.ofNullable?

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?

178
whirlwin

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é.

225
Tagir Valeev

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.

4
Karan Arora

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

  • empty () : pour un objet sans valeur, Insted avec null, nous pouvons utiliser Optional.empty ()
  • de (valeur T) : create Facultatif d'une valeur: Dans cette méthodela valeur null n'est pas autorisée.
  • ofNullable (valeur T) : create Facultatif d'une valeur et sila valeur peut être nulle

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

1
Rupesh Agrawal

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.

0
espendennis

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");
0
Gautam Chaurasia