web-dev-qa-db-fra.com

Java 8 Facultatif. Pourquoi et de Nullable?

J'ai une question concernant Java 8's Facultatif , dont le but est de s'attaquer aux exceptions NullPointerException.

La question est, quelle est la raison pour laquelle les deux types nous permettent de choisir:

Optional.of(T value)     <-----non-null value, null value will throw NPE
Optional.ofNullable(T value)   <----- nullable value

Parce que ce que j'attends, c'est quand j'utilise:

Optional.of(nullValue);

Il ne lancera pas de NullPointerException.


Développé ma question après quelques réponses:

Pourquoi les gens opteraient-ils pour Facultatif au lieu de normal if-else pour vérification nulle?

16
hades

Le javadoc de Optional.of lit cela explicitement:

@throws NullPointerException if value is null

et c'est là que l'exigence de gérer les cas comme prévu par vous entre en jeu avec l'utilisation de Optional.ofNullable qui est un petit bloc de code comme:

public static <T> Optional<T> ofNullable(T value) {
    return value == null ? empty() : of(value); // 'Optional.of'
}

Cela dit, la décision de choisir l'un plutôt que l'autre résidera dans la conception de l'application comme si votre value pouvait être null ou pas.


Du côté de vos attentes, ce n'était pas ce à quoi le Optional était réellement destiné. La note API clarifie cela davantage (formatage du mien):

Optional est principalement destiné à être utilisé comme type de retour de méthode où il est clairement nécessaire de représenter "aucun résultat" et où l'utilisation de null est susceptible de provoquer une erreur. Une variable dont le type est Optional ne doit jamais elle-même être null; il doit toujours pointer vers une instance Optional.


le but de Facultatif est de s'attaquer à l'exception NullPointerException.

A part: Juste pour le dire clairement, que le choix vous laisserait bien sûr implicitement définir si un NPE doit être lancé au moment de l'exécution ou non. Il n'est cependant pas déterminé au moment de la compilation.

19
Naman

l'objectif de Facultatif est de s'attaquer à l'exception NullPointerException

Oui, mais au moment de l'utilisation, pas à la création.

Ainsi, lorsque vous recevez un Optional d'une méthode, vous pouvez éviter NPE en utilisant Optional.ifPresent, Optional.orElse, Optional.orElseGet et Optional.orElseThrow méthodes.

Mais ce n'est pas le cas lorsque vous créez une option. Comme c'est votre propre méthode, vous devez savoir si l'objet peut être annulé ou non.


Le point principal de Facultatif est de fournir un moyen pour une fonction renvoyant une valeur pour indiquer l'absence d'un retour valeur . Voir cette discussion . Cela permet à l'appelant de continuer une chaîne d'appels de méthode fluide.

Stuart Marks

Veuillez lire cet article pour une explication plus détaillée.

12
ETO

Je pense que c'est assez simple et clair avec Javadoc:

Optional.of(T value) est utilisé lorsque vous êtes sûr qu'il n'y a jamais de valeur null et que la valeur nulle en cas d'incident se produit que le programme jette NullPointerException et considère comme bug.

Optional.ofNullable(T value) est utilisé lorsque vous savez qu'il peut y avoir une valeur null et dans le cas où votre programme devrait se comporter normalement.


Pourquoi les gens opteraient-ils pour Facultatif au lieu de la méthode normale if-else pour la vérification des valeurs nulles?

6
NullPointer

Après avoir lu quelques réponses et commentaires, je pense que cette explication manque. Considérez une méthode comme

public Optional<String> name(Customer c) {
    return c.isNew() ? Optional.ofNullable(getName(c)) : Optional.of(getName(c));
}

Ici, vous voulez lancer un NullPointerException si le client n'est pas nouveau et est censé avoir un nom; votre code est incohérent si jamais null. Pourtant, le nom peut ne pas encore exister si le client est nouveau, d'où ofNullable dans ce cas et la méthode renvoie Optional.

5
JollyJoker

Pourquoi les gens opteraient-ils pour la méthode facultative au lieu de la méthode normale if-else pour la vérification des valeurs nulles?

Le point principal de la classe Optional<T> Est de fournir un moyen pour effectuer des opérations de mappage null safe .

employeeOptional.map(Employee::getName).map(String::toUpperCase).ifPresent(upperCasedNameConsumer)

L'expression ci-dessus peut remplacer une cascade d'instructions if-else Dans une seule expression lisible.

Optional.of Fournit une assertion pour que l'argument donné soit une valeur null-null, Sinon, vous pouvez opter pour Optional.ofNullable Si vous n'êtes pas sûr de l'entrée.

Je vous recommande fortement de lire la classe javadoc pour Optional<T> Pour plus de méthodes de chaînage optionnelles que vous pouvez utiliser pour votre avantage.

4
HPH
  • Optional.ofNullable est un wrapper autour des API existantes qui peuvent renvoyer null. Vous l'appeleriez en tant que consommateur d'une API.
  • Optional.of/Optional.empty est pour le nouveau code écrit avec Optional à l'esprit. Vous renverriez un Optional créé avec of/empty en tant que fournisseur d'une API.
1
dnt