Anmerkungen zur Feder-Null-Sicherheit

1. Übersicht

Ab Spring 5 haben wir jetzt Zugriff auf eine interessante Funktion, mit der wir sichereren Code schreiben können. Diese Funktion wird als Nullsicherheit bezeichnet, eine Gruppe von Anmerkungen, die wie ein Schutz funktionieren und auf mögliche Nullreferenzen achten.

Anstatt uns mit unsicherem Code davonkommen zu lassen, erzeugt die Null-Sicherheitsfunktion beim Kompilieren Warnungen. Solche Warnungen können zur Laufzeit katastrophale Nullzeigerausnahmen (NPEs) verhindern.

2. Die Annotation @NonNull

Die Annotation @NonNull ist die wichtigste unter allen Annotationen der Nullsicherheitsfunktion . Wir können diese Annotation verwenden, um eine Nicht-Null-Einschränkung überall dort zu deklarieren, wo eine Objektreferenz erwartet wird: ein Feld, ein Methodenparameter oder der Rückgabewert einer Methode.

Angenommen, wir haben eine Klasse namens Person :

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

Diese Klassendefinition ist gültig, weist jedoch einen Fehler auf. Das Feld fullName kann auf null gesetzt werden . In diesem Fall könnten wir bei der Arbeit mit fullName eine NPE erhalten .

Mit der Null-Sicherheitsfunktion für Federn können Werkzeuge eine solche Gefahr melden. Wenn wir beispielsweise Code in IntelliJ IDEA schreiben und das Feld fullName mit der Annotation @NonNull dekorieren , wird eine Warnung angezeigt :

Dank dieser Angabe sind wir uns des Problems im Voraus bewusst und können geeignete Maßnahmen ergreifen, um einen Laufzeitfehler zu vermeiden.

3. Die Annotation @NonNullFields

Die Annotation @NonNull ist hilfreich, um die Nullsicherheit zu gewährleisten. Wir würden jedoch die gesamte Codebasis verschmutzen, wenn wir alle Nicht-Null-Felder mit dieser Anmerkung schmücken würden.

Wir können den Missbrauch von @NonNull mit einer anderen Anmerkung vermeiden - @NonNullFields . Diese Anmerkung gilt auf Paketebene und teilt unseren Entwicklungstools mit, dass alle Felder im mit Anmerkungen versehenen Paket standardmäßig nicht null sind.

Damit die Annotation @NonNullFields aktiviert wird , müssen Sie eine Datei mit dem Namen package-info.java im Stammverzeichnis des Pakets erstellen und das Paket mit @NonNullFields kommentieren :

@NonNullFields package org.baeldung.nullibility;

Deklarieren wir eine andere Eigenschaft in der Person- Klasse mit dem Namen 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 }

Dieses Mal, wir verschönern nicht die nickname Feld mit @NonNull aber immer noch eine ähnliche Einschränkung sehen:

Die Annotation @NonNullFields macht unseren Code weniger ausführlich und gewährleistet gleichzeitig das gleiche Sicherheitsniveau, das @NonNull bietet.

4. Die @Nullable Annotation

Die Annotation @NonNullFields ist im Allgemeinen @NonNull vorzuziehen, da sie zur Reduzierung der Boilerplate beiträgt. Manchmal möchten wir einige Felder von der auf Paketebene angegebenen Nicht-Null-Einschränkung ausnehmen.

Gehen wir zurück zu dem nickname Feld und dekorieren sie mit der @Nullable Anmerkung:

@Nullable private String nickName;

Die Warnung, die wir zuvor gesehen haben, ist jetzt weg:

In dieser Situation haben wir die Annotation @Nullable verwendet , um die Semantik von @NonNullFields in einem Feld zu überschreiben .

5. Die Annotation @NonNullApi

Die Annotation @NonNullFields gilt nur für Felder, wie der Name schon sagt. Wenn wir die gleichen Auswirkungen auf die Parameter und Rückgabewerte der Methoden haben möchten, benötigen wir @NonNullApi .

Wie bei @NonNullFields müssen wir die Annotation @NonNullApi in der Datei package-info.java angeben :

@NonNullApi package org.baeldung.nullibility;

Definieren wir einen Getter für das Feld nickName :

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

Mit der @NonNullApi Annotation in der Tat, wird eine Warnung über einen möglichen ausgegebenen Nullwert durch das erzeugte getNickName Methode:

Beachten Sie, dass wir genau wie die Annotation @NonNullFields die Annotation @NonNullApi auf Methodenebene mit der Annotation @Nullable überschreiben können .

6. Fazit

Die Nullsicherheit im Frühjahr ist eine großartige Funktion, die dazu beiträgt, die Möglichkeit von NPEs zu verringern. Es gibt jedoch zwei wichtige Punkte, auf die wir bei der Verwendung dieser Funktion achten müssen:

  • Es kann nur in einem unterstützenden Entwicklungstool wie IntelliJ IDEA verwendet werden
  • Dabei spielt es keine erzwingen null Prüfungen zur Laufzeit - wir müssen noch Code schreiben sie zur Abwendung NPE

Den Quellcode für dieses Tutorial finden Sie auf GitHub.