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?
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 denull
est susceptible de provoquer une erreur. Une variable dont le type estOptional
ne doit jamais elle-même êtrenull
; il doit toujours pointer vers une instanceOptional
.
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.
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.
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.
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
.
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.
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.