Attraper NullPointerException
es un une chose vraiment problématique à faire puisqu'ils peuvent se produire presque partout. Il est très facile d'en attraper un, de l'attraper par accident et de continuer comme si tout était normal, cachant ainsi un réel problème. C'est tellement délicat à gérer qu'il vaut mieux l'éviter complètement. (Par exemple, pensez à l'auto-déballage d'un fichier null Integer
.)
Je vous suggère d'utiliser le Optional
à la place. C'est souvent la meilleure approche lorsque vous voulez travailler avec des valeurs qui sont soit présentes, soit absentes.
En utilisant cela, vous pourriez écrire votre code comme ceci :
public Optional<Integer> m(Ws wsObject) {
return Optional.ofNullable(wsObject.getFoo()) // Here you get Optional.empty() if the Foo is null
.map(f -> f.getBar()) // Here you transform the optional or get empty if the Bar is null
.map(b -> b.getBaz())
.map(b -> b.getInt());
// Add this if you want to return null instead of an empty optional if any is null
// .orElse(null);
// Or this if you want to throw an exception instead
// .orElseThrow(SomeApplicationException::new);
}
Pourquoi facultatif ?
Utilisation de Optional
au lieu de null
pour les valeurs qui pourraient être absentes rend ce fait très visible et clair pour les lecteurs, et le système de types s'assurera que vous ne l'oubliez pas accidentellement.
Vous avez également accès à des méthodes permettant de travailler avec ces valeurs de manière plus pratique, telles que map
y orElse
.
L'absence est-elle valable ou une erreur ?
Mais réfléchissez également à la question de savoir si le fait que les méthodes intermédiaires renvoient un résultat nul est un résultat valide ou si c'est le signe d'une erreur. Si c'est toujours une erreur, il est probablement préférable de lever une exception plutôt que de renvoyer une valeur spéciale ou que les méthodes intermédiaires elles-mêmes lèvent une exception.
Peut-être plus d'options ?
Si, par contre, les valeurs absentes des méthodes intermédiaires sont valides, vous pouvez peut-être passer à la méthode suivante Optional
s pour eux aussi ?
Alors vous pourriez les utiliser comme ça :
public Optional<Integer> mo(Ws wsObject) {
return wsObject.getFoo()
.flatMap(f -> f.getBar())
.flatMap(b -> b.getBaz())
.flatMap(b -> b.getInt());
}
Pourquoi pas en option ?
La seule raison à laquelle je pense pour ne pas utiliser Optional
Le problème le plus important est qu'il s'agit d'une partie du code dont les performances sont vraiment critiques, et que la surcharge de la collecte des déchets s'avère être un problème. C'est parce que quelques Optional
sont alloués à chaque fois que le code est exécuté, et la VM pourrait ne sera pas en mesure de les optimiser. Dans ce cas, vos tests if originaux sont peut-être plus appropriés.
30 votes
Je ne serais pas contre
null
vérifie autant, puisquewsObject.getFoo().getBar().getBaz().getInt()
est déjà une odeur de code. Lisez ce que le "Loi de Déméter" est et préférez refactoriser votre code en conséquence. Alors le problème avec lenull
Les contrôles seront également supprimés. Et pensez à utiliserOptional
.9 votes
Et si on utilisait XPath et de la laisser à leur évaluation ?
16 votes
Ce code est probablement généré par
wsdl2java
qui ne respecte pas la loi de Déméter.