Annotations de sécurité nulle du printemps

1. Vue d'ensemble

À partir de Spring 5, nous avons désormais accès à une fonctionnalité intéressante qui nous aide à écrire du code plus sûr. Cette fonctionnalité s'appelle null-safety, un groupe d'annotations fonctionnant comme une sauvegarde qui surveille les références nulles potentielles.

Plutôt que de nous laisser nous en sortir avec du code non sécurisé, la fonction de sécurité nulle produit des avertissements au moment de la compilation. De tels avertissements peuvent empêcher les exceptions catastrophiques de pointeur nul (NPE) au moment de l'exécution.

2. L' annotation @NonNull

L' annotation @NonNull est la plus importante parmi toutes les annotations de la fonction de sécurité Null. Nous pouvons utiliser cette annotation pour déclarer une contrainte non nulle partout où une référence d'objet est attendue: un champ, un paramètre de méthode ou la valeur de retour d'une méthode.

Supposons que nous ayons une classe nommée Person :

public class Person { private String fullName; void setFullName(String fullName) { if (fullName != null && fullName.isEmpty()) { fullName = null; } this.fullName = fullName; } // getter }

Cette définition de classe est valide, mais présente un défaut - le champ fullName peut être défini sur null . Si cela se produit, nous pourrions nous retrouver avec un NPE lorsque nous travaillons avec fullName .

La fonction Spring null-safety permet aux outils de signaler un tel danger. Par exemple, si nous écrivons du code dans IntelliJ IDEA et décorons le champ fullName avec l' annotation @NonNull , nous verrons un avertissement:

Grâce à cette indication, nous sommes conscients du problème à l'avance et en mesure de prendre les mesures appropriées pour éviter une panne d'exécution.

3. L' annotation @NonNullFields

L' annotation @NonNull est utile pour garantir la sécurité nulle. Cependant, nous polluerions toute la base de code si vous orniez tous les champs non nuls de cette annotation.

Nous pouvons éviter l'abus de @NonNull avec une autre annotation - @NonNullFields . Cette annotation est applicable au niveau du package, notifiant à nos outils de développement que tous les champs du package annoté sont, par défaut, non nuls.

Pour que l' annotation @NonNullFields démarre , nous devons créer un fichier nommé package-info.java dans le répertoire racine du package et annoter le package avec @NonNullFields :

@NonNullFields package org.baeldung.nullibility;

Déclarons une autre propriété dans la classe Person , appelée nickName :

package org.baeldung.nullibility; // import statements public class Person { private String nickName; void setNickName(@Nullable String nickName) { if (nickName != null && nickName.isEmpty()) { nickName = null; } this.nickName = nickName; } // other declarations }

Cette fois, nous n'embellissons pas le champ nickName avec @NonNull mais voyons toujours une mise en garde similaire:

L' annotation @NonNullFields rend notre code moins verbeux tout en garantissant le même niveau de sécurité que celui fourni par @NonNull .

4. L' annotation @Nullable

L' annotation @NonNullFields est généralement préférable à @NonNull car elle permet de réduire le passe-partout. Parfois, nous voulons exempter certains champs de la contrainte non nulle spécifiée au niveau du package.

Revenons au champ nickName et décorons-le avec l' annotation @Nullable :

@Nullable private String nickName;

L'avertissement que nous avons vu avant est parti maintenant:

Dans cette situation, nous avons utilisé l' annotation @Nullable pour remplacer la sémantique de @NonNullFields sur un champ.

5. L' annotation @NonNullApi

L' annotation @NonNullFields s'applique uniquement aux champs, comme son nom l'indique. Si nous voulons avoir le même impact sur les paramètres des méthodes et les valeurs de retour, nous aurons besoin de @NonNullApi .

Comme pour @NonNullFields , nous devons spécifier l' annotation @NonNullApi dans le fichier package-info.java :

@NonNullApi package org.baeldung.nullibility;

Définissons un getter pour le champ nickName :

package org.baeldung.nullibility; // import statements public class Person { @Nullable private String nickName; String getNickName() { return nickName; } // other declarations }

Avec l' annotation @NonNullApi en vigueur, un avertissement est émis concernant une éventuelle valeur nulle produite par la méthode getNickName :

Notez que tout comme l' annotation @NonNullFields , nous pouvons remplacer @NonNullApi au niveau de la méthode avec l' annotation @Nullable .

6. Conclusion

Spring null-safety est une excellente fonctionnalité qui aide à réduire la possibilité de NPE. Cependant, il y a deux points importants dont nous devons nous méfier lors de l'utilisation de cette fonctionnalité:

  • Il n'est utilisable que dans un outil de développement de support, tel qu'IntelliJ IDEA
  • Il n'applique pas les vérifications nulles au moment de l'exécution - nous devons toujours écrire du code nous-mêmes pour éviter les NPE

Le code source de ce didacticiel se trouve à l'adresse over sur GitHub.