Spring-Null-Sicherheitsanmerkungen

Frühjahrsnull-Sicherheitsanmerkungen

1. Überblick

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. Hierbei handelt es sich um eine Gruppe von Annotationen, die wie eine Schutzmaßnahme funktionieren und auf mögliche Nullreferenzen achten.

the null-safety feature produces warnings at compile time. Solche Warnungen können zur Laufzeit katastrophale Nullzeigerausnahmen (NPEs) verhindern, anstatt uns mit unsicherem Code davonkommen zu lassen.

2. Die Annotation@NonNull

Die Annotation@NonNull ist die wichtigste unter allen Annotationen der Nullsicherheitsfunktion. We can use this annotation t0 declare non-null constraint anywhere an object reference is expected:ist ein Feld, ein Methodenparameter oder der Rückgabewert einer Methode.

Angenommen, wir haben eine Klasse namensPerson:

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 FeldfullName kann aufnull gesetzt werden. In diesem Fall könnten wir bei der Arbeit mitfullName eine NPE erhalten.

Die Nullsicherheitsfunktion von Spring ermöglicht es den Werkzeugen, eine solche Gefahr zu melden. Wenn wir beispielsweise Code in IntelliJ IDEA schreiben und das FeldfullNamemit der Anmerkung@NonNullverzieren, wird eine Warnung angezeigt:

image

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@NonNullist hilfreich, um die Nullsicherheit zu gewährleisten. Wir würden jedoch die gesamte Codebasis verschmutzen, wenn alle Nicht-Null-Felder mit dieser Anmerkung versehen würden.

Wir können den Missbrauch von@NonNull mit einer anderen Anmerkung vermeiden -@NonNullFields. This annotation is applicable at the package level, notifying our development tools that all fields in the annotated package are, by default, non-null.

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

@NonNullFields
package org.example.nullibility;

Deklarieren wir eine andere Eigenschaft in der KlassePerson mit dem NamennickName:

package org.example.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 verschönern wir das FeldnickNamenicht mit@NonNull, sehen aber dennoch eine ähnliche Einschränkung:

image

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

4. Die Annotation@Nullable

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

Kehren wir zum FeldnickNamezurück und dekorieren es mit der Anmerkung@Nullable:

@Nullable
private String nickName;

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

image

In dieser Situation istwe used the @Nullable annotation to override the semantics of @NonNullFields on a field.

5. Die Annotation@NonNullApi

Die Annotation@NonNullFieldsgilt nur für Felder, wie der Name schon sagt. If we want to have the same impact on the methods' parameters and return values, we’ll need @NonNullApi.

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

@NonNullApi
package org.example.nullibility;

Definieren wir einen Getter für das FeldnickName:

package org.example.nullibility;

// import statements

public class Person {
    @Nullable
    private String nickName;

    String getNickName() {
        return nickName;
    }

    // other declarations
}

Wenn die Annotation@NonNullApi aktiviert ist, wird eine Warnung über einen möglichen Wert vonnullausgegeben, der mit der MethodegetNickName erzeugt wird:

image

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

6. Fazit

Die Nullsicherheit der Feder ist eine großartige Funktion, die dazu beiträgt, die Möglichkeit von NPE 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

  • null Überprüfungen werden zur Laufzeit nicht erzwungen. Wir müssen weiterhin selbst Code schreiben, um NPEs abzuwenden

Der Quellcode für dieses Tutorial befindet sich inover on GitHub.