Je viens de commencer à utiliser l' @NotNull
annotation avec Java 8 et à obtenir des résultats inattendus.
J'ai une méthode comme celle-ci:
public List<Found> findStuff(@NotNull List<Searching> searchingList) {
... code here ...
}
J'ai écrit un test JUnit en passant la valeur nulle pour l'argument searchList. Je m'attendais à ce qu'une erreur se produise, mais elle s'est déroulée comme si l'annotation n'était pas là. Est-ce un comportement attendu? D'après ce que j'ai compris, c'était pour vous permettre d'éviter d'écrire le code de contrôle nul standard.
Une explication de ce que @NotNull est censé faire exactement serait grandement appréciée.
@NotNull
est juste une annotation. Les annotations ne font rien par elles-mêmes. Ils ont besoin d'un processeur d'annotation au moment de la compilation ou de quelque chose qui le traite au moment de l'exécution.Réponses:
@Nullable
et@NotNull
ne rien faire de leur propre chef. Ils sont censés agir comme des outils de documentation.L'
@Nullable
annotation vous rappelle la nécessité d'introduire une vérification NPE lorsque:L'
@NotNull
annotation est, en fait, un contrat explicite déclarant ce qui suit:ne peut pas nedoit pas contenir de valeur nulle.Par exemple, au lieu d'écrire:
Vous pouvez utiliser:
De plus, il
@NotNull
est souvent vérifié par ConstraintValidators (par exemple au printemps et en veille prolongée).L'
@NotNull
annotation n'effectue aucune validation par elle-même car la définition d'annotation ne fournit aucuneConstraintValidator
référence de type.Pour plus d'informations, voir:
la source
Optional
pourrait être utilisé à la place des@Null
valeurs de retour et une surcharge de méthode à la place des@Null
listes de paramètres: dolszewski.com/java/java-8-optional-use-cases* The annotated element must not be {@code null}. * Accepts any type.
et je pense que must word devrait être remplacé par should mais encore une fois cela dépend de la façon dont vous le lisez. Il serait certainement bon d'avoir plus de précisionsnull
mais qu'elle serait autorisée, vous utilisez l'annotation de manière incorrecte. Le terme n'implique pas qu'il est validé. Cependant, un indice selon lequel il n'est pas validé ne ferait pas de mal. Si vous souhaitez ajouter une validation automatique, vous pouvez utiliser certains outils externes. Par exemple, IntelliJ IDE a une prise en charge intégrée pour injecter des vérifications nulles.Comme mentionné ci-dessus,
@NotNull
ne fait rien de lui-même. Une bonne façon d'utiliser@NotNull
serait de l'utiliser avecObjects.requireNonNull
la source
this.bar = Objects.requireNonNull(bar, "bar must not be null");
Pour être
@NotNull
actif, vous avez besoin de Lombok:https://projectlombok.org/features/NonNull
Suivez: Quelle annotation Java @NotNull dois-je utiliser?
la source
SO @NotNull est juste une balise ... Si vous voulez la valider, vous devez utiliser quelque chose comme le validateur d'hibernation jsr 303
la source
Si vous utilisez Spring, vous pouvez forcer la validation en annotant la classe avec
@Validated
:Plus d'informations disponibles ici: Validation Javax @NotNull utilisation de l'annotation
la source
Je fais cela pour créer ma propre annotation de validation et validateur:
ValidCardType.java
(annotation à mettre sur les méthodes / champs)Et, le validateur pour déclencher le contrôle
CardTypeValidator.java
::Vous pouvez faire quelque chose de très similaire pour vérifier
@NotNull
.la source
Pour tester la validation de votre méthode dans un test, vous devez l'envelopper d'un proxy dans la méthode @Before.
Avec MethodValidationProxyFactory comme:
}
Et puis, ajoutez votre test:
la source