@Nullable Annotation Verwendung

347

Ich habe eine Methode in Java gesehen, die wie folgt deklariert wurde:

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

Was bedeutet @Nullable hier? Bedeutet das, dass die Eingabe sein könnte null?

Ohne die Anmerkung kann die Eingabe immer noch null sein. Ich denke, das ist nicht nur das?

user1508893
quelle
3
Aus den folgenden Antworten habe ich erfahren, dass die Anmerkung angibt, dass Nullwerte akzeptabel sind, Beispiele für die Verwendung, Code-Analysatoren, die ich ausprobieren kann, und dass die Interpretationen variieren können. Sehen Sie, warum dieses Format gut ist? + 1s rundum, besonders um diese Frage zu stellen.
Eiswasser
8
Welche Bibliothek wird @Nullableim Rahmen Ihrer Frage bereitgestellt ? Ist es Checker?
8bitjunkie

Antworten:

367

Es wird deutlich, dass die Methode Nullwerte akzeptiert und dass Sie beim Überschreiben der Methode auch Nullwerte akzeptieren sollten.

Es dient auch als Hinweis für Code-Analysatoren wie FindBugs . Wenn eine solche Methode beispielsweise ihr Argument dereferenziert, ohne vorher nach null zu suchen, gibt FindBugs eine Warnung aus.

JB Nizet
quelle
82

Diese Anmerkung wird üblicherweise zum Eliminieren verwendet NullPointerExceptions. @Nullablesagt, dass dieser Parameter sein könnte null. Ein gutes Beispiel für ein solches Verhalten finden Sie in Google Guice . In diesem einfachen Framework für die Abhängigkeitsinjektion können Sie erkennen, dass diese Abhängigkeit möglicherweise besteht null. Wenn Sie versuchen würden zu bestehennull ohne Anmerkung zu bestehen, würde sich das Framework weigern, seine Aufgabe zu erfüllen.

Was mehr ist @Nullable, kann mit @NotNullAnmerkungen verwendet werden. Hier finden Sie einige Tipps zur richtigen Verwendung. Die Codeüberprüfung in IntelliJ überprüft die Anmerkungen und hilft beim Debuggen des Codes.

Adam Sznajder
quelle
18

Verschiedene Werkzeuge können die Bedeutung von @Nullableunterschiedlich interpretieren . Zum Beispiel kann die Checker - Framework und FindBugs behandeln @Nullable anders .

Umprogrammierer
quelle
1

Zugegeben, es gibt definitiv andere Denkweisen. In meiner Welt kann ich "Niemals eine Null passieren" nicht durchsetzen, weil ich es mit unkontrollierbaren Dritten wie API-Aufrufern, Datenbankdatensätzen, ehemaligen Programmierern usw. zu tun habe. Daher bin ich paranoid und defensiv in Ansätzen . Da Sie Java8 oder höher verwenden, gibt es einen etwas saubereren Ansatz als einen ifBlock.

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

Sie können dort auch eine Ausnahme auslösen .orElse, indem Sie zu wechseln orElseThrow(() -> new Exception("Dont' send a null")).

Wenn Sie @Nullable nicht verwenden möchten, wodurch funktional nichts hinzugefügt wird, benennen Sie den Parameter einfach mit, mayBe...damit Ihre Absicht klar ist.

Manabu Tokunaga
quelle