@Nullable annotation usage

347

J'ai vu une méthode en java déclarée comme:

void foo(@Nullable Object obj)
{ ... }

Quelle est la signification d' @Nullableici? Cela signifie-t-il que l'entrée pourrait l'être null?

Sans l'annotation, l'entrée peut toujours être nulle, donc je suppose que ce n'est pas juste ça?

user1508893
la source
3
À partir des réponses ci-dessous, j'ai appris que l'annotation indique que les valeurs nulles sont acceptables, des exemples de l'endroit où elle est utilisée, des analyseurs de code que je peux essayer et que les interprétations peuvent varier. Voyez pourquoi ce format est bon? + 1 tout autour, surtout pour avoir posé cette question.
icedwater
8
Quelle bibliothèque propose @Nullabledans le cadre de votre question? Est-ce Checker?
8bitjunkie

Réponses:

367

Il indique clairement que la méthode accepte les valeurs nulles et que si vous remplacez la méthode, vous devez également accepter les valeurs nulles.

Il sert également d'indicateur pour les analyseurs de code comme FindBugs . Par exemple, si une telle méthode déréférence son argument sans vérifier d'abord null, FindBugs émet un avertissement.

JB Nizet
la source
82

Cette annotation est couramment utilisée pour éliminer NullPointerExceptions. @Nullabledit que ce paramètre pourrait être null. Un bon exemple d'un tel comportement peut être trouvé dans Google Guice . Dans ce cadre d'injection de dépendance léger, vous pouvez dire que cette dépendance pourrait l'être null. Si vous tentiez de passer nullsans annotation, le framework refuserait de faire son travail.

De plus, il @Nullablepeut être utilisé avec une @NotNullannotation. Vous trouverez ici quelques conseils pour les utiliser correctement. L'inspection de code dans IntelliJ vérifie les annotations et aide à déboguer le code.

Adam Sznajder
la source
1

Certes, il y a certainement des pensées différentes, dans mon monde, je ne peux pas imposer "Ne jamais passer une valeur nulle" parce que je traite avec des tiers incontrôlables comme les appelants API, les enregistrements de base de données, les anciens programmeurs, etc ... donc je suis paranoïaque et défensif dans les approches . Étant donné que vous utilisez Java8 ou une version ultérieure, il existe une approche un peu plus propre qu'un ifbloc.

public String foo(@Nullable String mayBeNothing) {
   return Optional.ofNullable(mayBeNothing).orElse("Really Nothing");
}

Vous pouvez également lancer une exception en remplaçant .orElsepar orElseThrow(() -> new Exception("Dont' send a null")).

Si vous ne voulez pas utiliser @Nullable, qui n'ajoute rien de fonctionnel, pourquoi ne pas simplement nommer le paramètre avec mayBe...pour que votre intention soit claire.

Manabu Tokunaga
la source