juin
2014
Parmi les classes sympathiques qui ont été rajoutées dans le JDK8, il en est une que je me prends à utiliser de plus en plus souvent : java.util.Optional
L’intérêt de cette classe est d’éviter les NullPointerException et de simplifier les tests sur la nullité d’une valeur.
Ainsi, qui n’a jamais eut de NullPointerException levée au moment où il faisait quelque chose ce de genre en invoquant une méthode ou un membre directement sur un objet ou encore en passant l’objet en paramètres d’autres fonctions :
foo.doSomething();
// Ou
doSomethingWithFoo(foo);
Il est facile de contourner le problème en faisant :
if (foo != null) {
foo.doSomething();
// Ou
doSomethingWithFoo(foo);
}
Évidement, pratiquement tout le temps on oublie de le faire jusqu’à ce que l’exception soit levée pour la première fois. Sans parler du fait qu’il faille multiplier les tests de nullité dans toutes les fonctions et methodes ou cet objet est utilisé…
Bien sur, une partie du problème peut être à nouveau contourné en utilisant un framework supportant l’annotation @NonNull (ou similaire) mais bien que des améliorations aient été apportées dans le JDK8 pour supporter une telle annotation… elle ne fait toujours pas partie de l’API par défaut (on se demande bien pourquoi d’ailleurs).
C’est ici que la classe Optional entre en jeu. Désormais on peut réécrire le code de la manière suivante :
foo.ifPresent(f -> f.doSomething());
// Ou
foo.ifPresent(f -> doSomethingWithFoo(f));
Si jamais la valeur retournée par getFoo() est nulle, foo ne sera pas null mais contiendra la valeur Optional.empty(). Dans ce cas foo n’est pas considéré comme « présent » et donc l’expression lambda ne sera jamais appelée. Si la valeur contenue dans foo n’est pas null, au contraire, foo est alors considéré comme présent et l’expression lambda sera invoquée. On peut donc manipuler foo sans craindre de lever une NullPointerException.
De plus on peut passer cette valeur optionnelle en paramètre d’autres fonctions et la manipuler sans danger en simplifiant le code puisqu’on a plus besoin de tester la nullité de la valeur reçue en paramètre.
Bien sur, cela demande un peu d’auto-discipline dans le codage : il ne faut jamais laisser une valeur ou un membre de type Optional non initialisé (c’est à dire à null) :
- Si la valeur est vide / nulle / absente, on l’initialisera avec Optional.empty()
- Si la valeur n’est jamais nulle, on l’initialisera avec Optional.of()
- Si la valeur peut être nulle, on l’initialisera avec Optional.ofNullable()
Commentaires récents
- Back from the future… dans
- Back from the future… dans
- Static linking = does not Compute dans
- Paquetage x 2 dans
- Why you little… dans