Est-ce que Guava fournit une méthode pour obtenir une valeur par défaut si une référence d'objet passée est null
? Je cherche quelque chose comme <T> T nullToDefault(T obj, T default)
, si par défaut est retourné si obj est null
.
Ici, sur stackoverflow, je n'ai rien trouvé à ce sujet. Je ne cherche qu'une solution de goyave pure (s'il y en a)!
Je n'ai rien trouvé dans l'API Gauva 10, seulement com.google.common.base.Objects
semble prometteur mais manque quelque chose de similaire.
En plus de Objects.firstNonNull
, Guava 10.0 a ajouté la classe Facultatif comme solution plus générale à ce type de problème.
Un Optional
est quelque chose qui peut ou non contenir une valeur. Il existe différentes manières de créer une instance Optional
, mais dans votre cas, la méthode d'usine Optional.fromNullable(T)
est appropriée.
Une fois que vous disposez d'un Optional
, vous pouvez utiliser l'une des méthodes or
pour obtenir la valeur que contient le Optional
(si elle contient une valeur) ou une autre valeur (si elle ne fait pas).
En mettant tout cela ensemble, votre exemple simple ressemblerait à:
T value = Optional.fromNullable(obj).or(defaultValue);
La flexibilité supplémentaire de Optional
intervient si vous souhaitez utiliser un Supplier
pour la valeur par défaut (donc vous ne faites pas le calcul pour l'obtenir sauf si nécessaire) ou si vous voulez enchaîner plusieurs ensemble des valeurs facultatives pour obtenir la première valeur présente, par exemple:
T value = someOptional.or(someOtherOptional).or(someDefault);
Que diriez-vous
MoreObjects.firstNonNull(obj, default)
Voir JavaDoc .
(Note historique: la classe MoreObjects
était autrefois appelée Objects
, mais elle a été renommée pour éviter toute confusion avec Java.util.Objects
classe introduite dans Java 7. La classe Guava Objects
est désormais obsolète.)
Comme dit précédemment, la solution Guava est correcte.
Il existe cependant une solution pure JDK avec Java 8:
Optional.ofNullable( var ).orElse( defaultValue );
Voir la documentation de Java.util.Optional
Cela devrait faire l'affaire: Objects.firstNonNull(o, default)
Voir doc API Guava
Si votre objet n'est pas déjà facultatif, les suggestions Facultatif/firstNotNull compliquent ce qu'est une simple fonction Java, l'opérateur ternaire:
T myVal = (val != null) ? val : defaultVal;
L'inclusion d'une dépendance et de plusieurs appels de méthodes introduit autant de complexité de lecture que l'opérateur ternaire. Je dirais même que l'utilisation de Optional
contrairement à sa 'ma méthode peut ou peut ne pas retourner un objet' est un drapeau rouge indiquant que vous faites quelque chose de mal (tout comme dans d'autres cas où l'on abuse de quelque chose de contraire à sens sémantique de cette chose).
Voir http://alvinalexander.com/Java/edu/pj/pj010018 pour plus de discussion sur l'opérateur ternaire.
Si vous ne parlez que de chaînes, il existe également des méthodes Apache Commons defaultString et defaultIfEmpty
defaultString vous donnera uniquement la valeur par défaut sur un vrai null tandis que defaultIfEmpty vous donnera la valeur par défaut sur une chaîne nulle ou vide.
Il y a aussi defaultIfBlank qui vous donnera la valeur par défaut même sur une chaîne vide.
par exemple.
String description = "";
description = StringUtils.defaultIfBlank(description, "Theodore");
la description sera désormais égale à "Theodore"
Edit: Apache Commons a également une classe ObjectUtils qui fait des valeurs par défaut nulles pour les objets entièrement cuits ...
Juste pour info, Java 9 a deux méthodes qui font exactement ce que vous voulez:
public static <T> T requireNonNullElse(T obj, T defaultObj);
Et une version paresseuse:
public static <T> T requireNonNullElseGet(T obj, Supplier<? extends T> supplier)
Java.util.Objects et Guava's facultatifs fournissent une bonne façon d'obtenir le remplacement de null aux valeurs par défaut ... en les utilisant beaucoup
Mais voici quelque chose pour un esprit plus impératif:
public static <T> T firstNotNuLL(T...args){
for (T arg : args)
if ( arg != null) return arg;
throw new NullPointerException();
}
Pensez à utiliser le Optional
intégré à Guava 10. Vous pouvez enchaîner plusieurs options, comme Optional.fromNullable(var).orNull()
ou Optional.fromNullable(var).or(Optional.of(var2)).orNull()
Vous pouvez utiliser la bibliothèque ObjectUtils.defaultIfNull()
de org.Apache.commons.lang :
public static <T> T defaultIfNull(T object, T defaultValue)