Ich möchte meinen Code besser lesbar machen und Tools wie IDE-Code-Inspektion und / oder statische Code-Analyse (FindBugs und Sonar) verwenden, um NullPointerExceptions zu vermeiden. Viele der Werkzeuge scheinen unvereinbar mit jedem anderen @NotNull
/ @NonNull
/ @Nonnull
Anmerkung und in meinem Code alle von ihnen Auflistung wäre schrecklich zu lesen. Irgendwelche Vorschläge, welcher der "besten" ist? Hier ist die Liste der entsprechenden Anmerkungen, die ich gefunden habe:
javax.validation.constraints.NotNull
Erstellt für die Laufzeitvalidierung, nicht für statische Analysen.
Dokumentationedu.umd.cs.findbugs.annotations.NonNull
Wird von der statischen Analyse von Findbugs und damit von der Sonar- Dokumentation (jetzt Sonarqube ) verwendet
javax.annotation.Nonnull
Dies funktioniert möglicherweise auch mit Findbugs, aber JSR-305 ist inaktiv. (Siehe auch: Wie ist der Status von JSR 305? ) Quelleorg.jetbrains.annotations.NotNull
Wird von IntelliJ IDEA IDE für die statische Analyse verwendet.
Dokumentationlombok.NonNull
Wird zur Steuerung der Codegenerierung in Project Lombok verwendet .
Platzhalter-Annotation, da es keinen Standard gibt.
Quelle , Dokumentationandroid.support.annotation.NonNull
Markierungsanmerkung in Android verfügbar, bereitgestellt durch die Dokumentation des Support-Annotations-Pakets
org.eclipse.jdt.annotation.NonNull
Wird von Eclipse für die Dokumentation der statischen Code-Analyse verwendet
quelle
com.sun.istack.internal.NotNull
. OMG ...Antworten:
Da JSR 305 (dessen Ziel es war, zu standardisieren
@NonNull
und@Nullable
) seit mehreren Jahren inaktiv ist, gibt es leider keine gute Antwort. Wir können nur eine pragmatische Lösung finden, und meine lautet wie folgt:Syntax
Aus rein stilistischer Sicht möchte ich jegliche Bezugnahme auf IDE, Framework oder ein Toolkit außer Java selbst vermeiden.
Dies schließt aus:
android.support.annotation
edu.umd.cs.findbugs.annotations
org.eclipse.jdt.annotation
org.jetbrains.annotations
org.checkerframework.checker.nullness.qual
lombok.NonNull
Was uns entweder
javax.validation.constraints
oder lässtjavax.annotation
. Ersteres kommt mit JEE. Ob dies besser ist alsjavax.annotation
, was irgendwann mit JSE oder gar nicht kommen könnte, ist umstritten. Ich persönlich bevorzuge es,javax.annotation
weil mir die JEE-Abhängigkeit nicht gefallen würde.Das lässt uns mit
javax.annotation
Das ist auch die kürzeste.
Es gibt nur eine Syntax, die noch besser wäre :
java.annotation.Nullable
. Da andere Pakete in der Vergangenheit vonjavax
bisjava
aufgestiegen sind, wäre die javax.annotation ein Schritt in die richtige Richtung.Implementierung
Ich hatte gehofft, dass sie alle im Grunde die gleiche triviale Implementierung haben, aber eine detaillierte Analyse zeigte, dass dies nicht wahr ist.
Zunächst zu den Ähnlichkeiten:
Die
@NonNull
Anmerkungen haben alle die Zeileausser für
org.jetbrains.annotations
das nennt es@NotNull
und hat eine triviale Implementierungjavax.annotation
das hat eine längere Implementierungjavax.validation.constraints
das nennt es auch@NotNull
und hat eine ImplementierungDie
@Nullable
Anmerkungen haben alle die Zeilemit Ausnahme (wieder) der
org.jetbrains.annotations
mit ihrer trivialen Umsetzung.Für die Unterschiede:
Auffällig ist das
javax.annotation
javax.validation.constraints
org.checkerframework.checker.nullness.qual
Alle haben Laufzeitanmerkungen (
@Retention(RUNTIME)
), währendandroid.support.annotation
edu.umd.cs.findbugs.annotations
org.eclipse.jdt.annotation
org.jetbrains.annotations
sind nur Kompilierzeit (
@Retention(CLASS)
).Wie in dieser SO-Antwort beschrieben, ist die Auswirkung von Laufzeitanmerkungen geringer als man denkt, aber sie haben den Vorteil, dass Tools zusätzlich zu den Kompilierungszeitpunkten Laufzeitprüfungen durchführen können.
Ein weiterer wichtiger Unterschied besteht darin, wo im Code die Anmerkungen verwendet werden können. Es gibt zwei verschiedene Ansätze. Einige Pakete verwenden JLS 9.6.4.1-Kontexte. Die folgende Tabelle gibt einen Überblick:
org.eclipse.jdt.annotation
,javax.annotation
Undorg.checkerframework.checker.nullness.qual
verwenden Sie die definierte Kontexte in JLS 4.11, was der richtige Weg , meiner Meinung nach ist es zu tun.Das lässt uns mit
javax.annotation
org.checkerframework.checker.nullness.qual
in dieser Runde.
Code
Um Ihnen zu helfen, weitere Details selbst zu vergleichen, liste ich den Code jeder Anmerkung unten auf. Um den Vergleich zu erleichtern, habe ich Kommentare, Importe und
@Documented
Anmerkungen entfernt. (Sie hatten alle@Documented
bis auf die Klassen aus dem Android-Paket). Ich habe die Zeilen und@Target
Felder neu angeordnet und die Qualifikationen normalisiert.Der Vollständigkeit halber hier die
@Nullable
Implementierungen:Die folgenden zwei Pakete haben keine
@Nullable
, daher liste ich sie separat auf. Lombok hat eine ziemlich langweilige@NonNull
. Injavax.validation.constraints
der@NonNull
ist eigentlich eine@NotNull
und es hat eine längliche Umsetzung.Unterstützung
Aus meiner Erfahrung
javax.annotation
wird zumindest von Eclipse und dem Checker Framework sofort unterstützt.Zusammenfassung
Meine ideale Anmerkung wäre die
java.annotation
Syntax mit der Checker Framework-Implementierung.Wenn Sie das Checker Framework nicht verwenden möchten, ist das
javax.annotation
( JSR-305 ) vorerst immer noch die beste Wahl.Wenn Sie bereit sind, sich in das Checker Framework einzukaufen, verwenden Sie einfach deren
org.checkerframework.checker.nullness.qual
.Quellen
android.support.annotation
vonandroid-5.1.1_r1.jar
edu.umd.cs.findbugs.annotations
vonfindbugs-annotations-1.0.0.jar
org.eclipse.jdt.annotation
vonorg.eclipse.jdt.annotation_2.1.0.v20160418-1457.jar
org.jetbrains.annotations
vonjetbrains-annotations-13.0.jar
javax.annotation
vongwt-dev-2.5.1-sources.jar
org.checkerframework.checker.nullness.qual
vonchecker-framework-2.1.9.zip
lombok
vonlombok
Commitf6da35e4c4f3305ecd1b415e2ab1b9ef8a9120b4
javax.validation.constraints
vonvalidation-api-1.0.0.GA-sources.jar
quelle
javax.annotation
ist, dass es a) auf einem toten JSR basiert, b) schwer zu finden ist, ein Artefakt, das nur die Anmerkungen liefert und beibehalten wird. Der von findbugs ist nicht: search.maven.org/…javax.annotation
ist, dass es Probleme mit Java 9 verursacht, da andere Module ebenfalls Klassen in diesem Paket bereitstellen (jax-ws).javax.annotation.NonNull
, wurde nie fertiggestellt, da sein Spezifikationsvorsprung AWOL ging. Es hatte nichts mit einer Entscheidung von Oracle zu tun.Ich mag das Checker Framework sehr , eine Implementierung von Typanmerkungen ( JSR-308 ), mit der Fehlerprüfer wie ein Nullheitsprüfer implementiert werden. Ich habe nicht wirklich versucht, einen Vergleich anzubieten, aber ich war mit dieser Implementierung zufrieden.
Ich bin nicht mit der Gruppe verbunden, die die Software anbietet, aber ich bin ein Fan.
Vier Dinge, die ich an diesem System mag:
Es hat eine Fehlerprüfung für die Nichtigkeit (@Nullable), aber auch eine für Unveränderlichkeit und Internierung (und andere). Ich benutze die erste (Nullheit) und versuche, die zweite (Unveränderlichkeit / IGJ) zu verwenden. Ich probiere das dritte aus, bin mir aber noch nicht sicher, ob ich es langfristig einsetzen soll. Ich bin noch nicht von der allgemeinen Nützlichkeit der anderen Prüfer überzeugt, aber es ist schön zu wissen, dass das Framework selbst ein System zur Implementierung einer Vielzahl zusätzlicher Anmerkungen und Prüfer ist.
Das Standardeinstellung für die Nullheitsprüfung funktioniert gut: Nicht null außer Einheimischen (NNEL). Grundsätzlich bedeutet dies, dass der Prüfer standardmäßig alles (Instanzvariablen, Methodenparameter, generische Typen usw.) mit Ausnahme lokaler Variablen so behandelt, als hätten sie standardmäßig den Typ @NonNull. Gemäß der Dokumentation:
Sie können einen anderen Standard für eine Klasse oder eine Methode festlegen, wenn NNEL für Sie nicht funktioniert.
Mit diesem Framework können Sie verwenden, ohne eine Abhängigkeit vom Framework zu erstellen, indem Sie Ihre Anmerkungen in einen Kommentar einfügen: z
/*@Nullable*/
. Dies ist hilfreich, da Sie eine Bibliothek oder einen gemeinsam genutzten Code mit Anmerkungen versehen und überprüfen können, diese Bibliothek / diesen gemeinsam genutzten Code jedoch weiterhin in einem anderen Projekt verwenden können, das das Framework nicht verwendet. Dies ist eine schöne Funktion. Ich habe mich daran gewöhnt, es zu verwenden, obwohl ich das Checker Framework jetzt für alle meine Projekte aktiviere.Das Framework bietet eine Möglichkeit, von Ihnen verwendete APIs zu kommentieren , die nicht bereits mit Stub-Dateien auf Null gesetzt wurden.
quelle
Ich benutze die IntelliJ, weil ich mich hauptsächlich mit der Kennzeichnung von Dingen befasse, die eine NPE erzeugen könnten. Ich stimme zu, dass es frustrierend ist, keine Standardanmerkung im JDK zu haben. Es ist die Rede davon, es hinzuzufügen, es könnte es in Java 7 schaffen. In diesem Fall wird es eine weitere geben, aus der Sie auswählen können!
quelle
javax.annotation.Nonnull
wird allgemein akzeptiert, nicht wahr?Gemäß der Java 7-Funktionsliste werden Anmerkungen vom Typ JSR-308 auf Java 8 verschoben. Anmerkungen vom Typ JSR-305 werden nicht einmal erwähnt.
In einem Anhang des neuesten JSR-308-Entwurfs finden Sie einige Informationen zum Status von JSR-305 . Dies schließt die Beobachtung ein, dass JSR-305-Anmerkungen offenbar aufgegeben werden. Die JSR-305-Seite zeigt es auch als "inaktiv" an.
In der Zwischenzeit besteht die pragmatische Antwort darin, die Annotationstypen zu verwenden, die von den am häufigsten verwendeten Tools unterstützt werden ... und bereit zu sein, sie zu ändern, wenn sich die Situation ändert.
Tatsächlich definiert JSR-308 keine Annotationstypen / -klassen, und es sieht so aus, als ob sie denken, dass dies außerhalb des Gültigkeitsbereichs liegt. (Und sie haben Recht, angesichts der Existenz von JSR-305).
Wenn JSR-308 jedoch wirklich so aussieht, als würde es in Java 8 aufgenommen, würde es mich nicht überraschen, wenn das Interesse an JSR-305 wiederbelebt würde. AFAIK, das JSR-305-Team hat seine Arbeit nicht offiziell aufgegeben. Sie sind gerade seit 2+ Jahren still.
Es ist interessant, dass Bill Pugh (der technische Leiter für JSR-305) einer der Typen hinter FindBugs ist.
quelle
Für Android-Projekte sollten Sie
android.support.annotation.NonNull
und verwendenandroid.support.annotation.Nullable
. Diese und andere hilfreiche Android-spezifische Anmerkungen finden Sie in der Support-Bibliothek .Von http://tools.android.com/tech-docs/support-annotations :
quelle
javax.annotation.*
AnmerkungenWenn jemand nur nach den IntelliJ-Klassen sucht: Sie können sie aus dem Maven-Repository mit abrufen
quelle
JSR305 und FindBugs wurden von derselben Person verfasst. Beide sind schlecht gewartet, aber so Standard wie es nur geht und werden von allen wichtigen IDEs unterstützt. Die gute Nachricht ist, dass sie so funktionieren, wie sie sind.
Hier erfahren Sie, wie Sie @Nonnull standardmäßig auf alle Klassen, Methoden und Felder anwenden. Siehe https://stackoverflow.com/a/13319541/14731 und https://stackoverflow.com/a/9256595/14731
@NotNullByDefault
2. Fügen Sie jedem Paket die Anmerkung hinzu:
package-info.java
UPDATE : Ab dem 12. Dezember 2012 ist JSR 305 als "ruhend" aufgeführt. Laut Dokumentation:
Es sieht aus wie JSR 308 ist es in JDK 8 zu machen , und obwohl die JSR @NotNull nicht definieren, die begleitend
Checkers Framework
tut. Zum Zeitpunkt dieses Schreibens ist das Maven-Plugin aufgrund dieses Fehlers unbrauchbar: https://github.com/typetools/checker-framework/issues/183quelle
Unterscheiden Sie zwischen statischer Analyse und Laufzeitanalyse. Verwenden Sie die statische Analyse für interne Inhalte und die Laufzeitanalyse für die öffentlichen Grenzen Ihres Codes.
Für Dinge, die nicht null sein sollten:
Laufzeitprüfung: Verwenden Sie "if (x == null) ..." (Nullabhängigkeit) oder @ javax.validation.NotNull (mit Bean-Validierung) oder @ lombok.NonNull (schlicht und einfach) oder Guaven Preconditions.checkNotNull (.. .)
Statische Prüfung: Verwenden Sie eine Annotation @NonNull
Dies sollte das beste Ergebnis liefern: Warnungen in der IDE, Fehler von Findbugs und checkerframework, sinnvolle Laufzeitausnahmen.
Erwarten Sie nicht, dass statische Prüfungen ausgereift sind, ihre Benennung nicht standardisiert ist und verschiedene Bibliotheken und IDEs sie unterschiedlich behandeln, ignorieren Sie sie. Die JSR305-Klassen javax.annotations. * Sehen wie Standard aus, sind es jedoch nicht und verursachen Split-Pakete mit Java9 +.
Einige Anmerkungen Erklärungen:
Vor Java9 ist dies meine Empfehlung:
Beachten Sie, dass es keine Möglichkeit gibt, Spotbugs dazu zu bringen, eine Warnung auszulösen, wenn ein nullfähiger Methodenparameter dereferenziert wird (zum Zeitpunkt des Schreibens Version 3.1 von Spotbugs). Vielleicht kann checkerframework das tun.
Leider unterscheiden diese Anmerkungen nicht zwischen den Fällen einer öffentlichen Methode einer Bibliothek mit beliebigen Aufrufseiten und nicht öffentlichen Methoden, bei denen jede Aufrufstelle bekannt sein kann. Die doppelte Bedeutung von: "Geben Sie an, dass null unerwünscht ist, aber bereiten Sie sich dennoch darauf vor, dass null übergeben wird" ist in einer einzelnen Deklaration nicht möglich. Daher enthält das obige Beispiel unterschiedliche Anmerkungen für die Schnittstelle und die Implementierung.
In Fällen, in denen der Split-Interface-Ansatz nicht praktikabel ist, ist der folgende Ansatz ein Kompromiss:
Dies hilft den Clients, nicht null zu übergeben (korrekten Code zu schreiben) und in diesem Fall nützliche Fehler zurückzugeben.
quelle
Eclipse hat auch eigene Anmerkungen.
Weitere Informationen finden Sie unter http://wiki.eclipse.org/JDT_Core/Null_Analysis .
quelle
Ich möchte nur darauf hinweisen, dass die Java Validation API (
javax.validation.constraints.*
) keine@Nullable
Anmerkung enthält, was in einem statischen Analysekontext sehr wertvoll ist. Dies ist für die Laufzeit-Bean-Validierung sinnvoll, da dies die Standardeinstellung für nicht primitive Felder in Java ist (dh nichts, was validiert / erzwungen werden muss). Für die angegebenen Zwecke sollte das in Richtung der Alternativen abwägen.quelle
Leider
JSR 308
werden hier nicht mehr Werte als in diesem Projekt hinzugefügtJava 8
wird nicht mit einer einzigen Standardanmerkung oder einem eigenenChecker
Framework geliefert. Ähnlich wie bei Find-Bugs oderJSR 305
wird dieser JSR von einer kleinen Gruppe überwiegend akademischer Teams schlecht gepflegt.Keine kommerzielle Macht dahinter,
JSR 308
startet daherEDR 3
(Early Draft Review atJCP
) JETZT,Java 8
soll aber in weniger als 6 Monaten310
versendet werden : -O Ähnlich wie übrigens. Im Gegensatz dazu308 Oracle
hat sich das jetzt von seinen Gründern übernommen, um den Schaden für die Java-Plattform so gering wie möglich zu halten.Jedes Projekt, jeder Anbieter und jede akademische Klasse, wie die hinter dem
Checker Framework
undJSR 308
erstellt eine eigene Prüferanmerkung.Quellcode für die kommenden Jahre inkompatibel machen, bis einige beliebte Kompromisse gefunden und möglicherweise zu
Java 9
oder10
oder über Frameworks wieApache Commons
oder hinzugefügt werden konntenGoogle Guava
;-)quelle
Android
Diese Antwort ist Android-spezifisch. Android hat Support-Paket namens
support-annotations
. Dies bietet Dutzende von Android-spezifischen Anmerkungen und häufig verwendete wieNonNull
:Nullable
usw.Fügen Sie zum Hinzufügen des Support-Annotations- Pakets die folgende Abhängigkeit in Ihr build.gradle ein:
und dann benutze:
quelle
Während Sie darauf warten, dass dies vorgelagert wird (Java 8?), Können Sie auch einfach Ihre eigenen projektlokalen
@NotNull
und@Nullable
Anmerkungen definieren. Dies kann auch nützlich sein, wenn Sie mit Java SE arbeiten, wojavax.validation.constraints
es standardmäßig nicht verfügbar ist.Dies wäre zugegebenermaßen größtenteils zu dekorativen oder zukunftssicheren Zwecken, da das oben Gesagte offensichtlich an und für sich keine Unterstützung für die statische Analyse dieser Anmerkungen bietet.
quelle
Wenn Sie für Android entwickeln, sind Sie etwas an Eclipse gebunden (bearbeiten: zum Zeitpunkt des Schreibens nicht mehr), das seine eigenen Anmerkungen hat. Es ist in Eclipse 3.8+ (Juno) enthalten, aber standardmäßig deaktiviert.
Sie können es unter Einstellungen> Java> Compiler> Fehler / Warnungen> Nullanalyse aktivieren (reduzierbarer Abschnitt unten).
Aktivieren Sie "Annotationsbasierte Nullanalyse aktivieren".
http://wiki.eclipse.org/JDT_Core/Null_Analysis#Usage enthält Empfehlungen zu Einstellungen. Wenn Sie jedoch externe Projekte in Ihrem Arbeitsbereich haben (wie das Facebook-SDK), erfüllen diese möglicherweise nicht diese Empfehlungen, und Sie möchten sie wahrscheinlich nicht bei jedem SDK-Update beheben ;-)
Ich benutze:
quelle
@chaqke
.Wenn Sie an einem großen Projekt arbeiten, ist es möglicherweise besser, eigene
@Nullable
und / oder@NotNull
Anmerkungen zu erstellen .Zum Beispiel:
Wenn Sie die richtige Aufbewahrungsrichtlinie verwenden , sind die Anmerkungen zur Laufzeit nicht verfügbar . Aus dieser Sicht ist es nur eine interne Sache.
Obwohl dies keine strenge Wissenschaft ist, halte ich es für am sinnvollsten, eine interne Klasse dafür zu verwenden.
@Nullable
/@NotNull
Anmerkungen.Zusätzliche Fragen (siehe Kommentare):
Wie konfiguriere ich das in IntelliJ?
quelle
idea
nichts darüber erzähltvoid test(@NonNull String s) {}
, vontest(null);
Es gibt hier bereits zu viele Antworten, aber (a) es ist 2019 und es gibt immer noch keinen "Standard"
Nullable
und (b) keine anderen Antwortreferenzen Kotlin.Der Verweis auf Kotlin ist wichtig, da Kotlin zu 100% mit Java interoperabel ist und über eine zentrale Null-Sicherheitsfunktion verfügt. Beim Aufrufen von Java-Bibliotheken können diese Anmerkungen genutzt werden, um Kotlin-Tools darüber zu informieren, ob eine Java-API akzeptieren oder zurückgeben kann
null
.Soweit ich weiß,
Nullable
sindorg.jetbrains.annotations
undandroid.support.annotation
(jetztandroidx.annotation
) die einzigen mit Kotlin kompatiblen Pakete . Letzteres ist nur mit Android kompatibel und kann daher nicht in Nicht-Android-JVM / Java / Kotlin-Projekten verwendet werden. Das JetBrains-Paket funktioniert jedoch überall.Wenn Sie also Java-Pakete entwickeln, die auch in Android und Kotlin funktionieren sollten (und von Android Studio und IntelliJ unterstützt werden), ist das JetBrains-Paket wahrscheinlich die beste Wahl.
Maven:
Gradle:
quelle
Es gibt eine andere Möglichkeit, dies in Java 8 zu tun. Ich mache zwei Dinge, um das zu erreichen, was ich brauchte:
java.util.Optional
java.util.Objects.requireNonNull
Beispiel:
Meine Frage ist also, müssen wir bei der Verwendung von Java 8 überhaupt Anmerkungen machen?
Bearbeiten: Ich fand später heraus, dass einige eine schlechte Praxis für die Verwendung
Optional
in Argumenten in Betracht ziehen. Hier gibt es eine gute Diskussion mit Vor- und Nachteilen. Warum sollte Java 8's Optional nicht in Argumenten verwendet werden?Alternative Option, da die Verwendung von Optional in Argumenten nicht empfohlen wird, benötigen wir 2 Konstruktoren:
quelle
new Role(null,null,null,null);
. Mit den Anmerkungen warnt meine IDE und statische Analyse, dass null nicht an diese Parameter übergeben werden kann. Ohne es finde ich es nicht heraus, bis ich den Code ausführe. Das ist der Wert der Anmerkungen.description
nicht null machen und der Client-Code könnte einen leeren String übergeben, aber in vielen Fällen könnte es nützlich sein, zwischen einem leeren String zu unterscheiden und keinen Wert zu haben. Vielen Dank für Ihren Kommentar. Ich werde die Antwort aktualisieren.Hat die Sonne jetzt keine eigene? Was ist das:
http://www.java2s.com/Open-Source/Java-Document/6.0-JDK-Modules-com.sun/istack/com.sun.istack.internal.htm
Dies scheint mit allen Java-Versionen gepackt zu sein, die ich in den letzten Jahren verwendet habe.
Bearbeiten: Wie in den Kommentaren unten erwähnt, möchten Sie diese wahrscheinlich nicht verwenden. In diesem Fall stimme ich für die Anmerkungen zu IntelliJ Jetbrains!
quelle
Eines der schönen Dinge an IntelliJ ist, dass Sie ihre Anmerkungen nicht verwenden müssen. Sie können Ihre eigenen schreiben oder die eines beliebigen anderen Tools verwenden. Sie sind nicht einmal auf einen einzigen Typ beschränkt. Wenn Sie zwei Bibliotheken verwenden, die unterschiedliche @ NotNull-Annotationen verwenden, können Sie IntelliJ anweisen, beide zu verwenden. Gehen Sie dazu zu "Inspektionen konfigurieren", klicken Sie auf die Inspektion "Konstante Bedingungen und Ausnahmen" und klicken Sie auf die Schaltfläche "Inspektionen konfigurieren". Ich verwende den Nullness Checker, wo immer ich kann, und richte IntelliJ so ein, dass diese Anmerkungen verwendet werden. Sie können ihn jedoch mit jedem anderen gewünschten Tool verwenden. (Ich habe keine Meinung zu den anderen Tools, da ich seit Jahren die Inspektionen von IntelliJ verwende und sie liebe.)
quelle
Eine weitere Option sind die mit ANTLR 4 bereitgestellten Anmerkungen. Nach der Pull-Anforderung Nr. 434 enthält das Artefakt, das die Anmerkungen
@NotNull
und@Nullable
enthält, einen Anmerkungsprozessor, der Fehler und / oder Warnungen zur Kompilierungszeit erzeugt, falls eines dieser Attribute missbraucht wird (z. B. wenn beide werden auf dasselbe Element@Nullable
angewendet oder wenn es auf ein Element mit einem primitiven Typ angewendet wird). Der Anmerkungsprozessor bietet während des Softwareentwicklungsprozesses zusätzliche Sicherheit, dass die durch die Anwendung dieser Anmerkungen übermittelten Informationen korrekt sind, auch in Fällen von Methodenvererbung.quelle
Wenn Sie Ihre Anwendung mit Spring Framework erstellen, würde ich die Verwendung von
javax.validation.constraints.NotNull
Comming from Beans Validation empfehlen, das in der folgenden Abhängigkeit verpackt ist:Der Hauptvorteil dieser Annotation besteht darin, dass Spring sowohl Methodenparameter als auch mit Annotationen versehene Klassenfelder unterstützt
javax.validation.constraints.NotNull
. Alles, was Sie tun müssen, um den Support zu aktivieren, ist:Stellen Sie das API-JAR für die Beans-Validierung und das JAR mit der Implementierung des Validators für jsr-303 / jsr-349-Annotationen bereit (die mit der Abhängigkeit von Hibernate Validator 5.x geliefert werden):
Stellen Sie MethodValidationPostProcessor für den Spring-Kontext bereit
Schließlich kommentieren Sie Ihre Klassen mit Spring's
org.springframework.validation.annotation.Validated
und die Validierung wird automatisch von Spring durchgeführt.Beispiel:
Wenn Sie versuchen, die Methode doSomething aufzurufen und null als Parameterwert zu übergeben, wird spring (mithilfe von HibernateValidator) ausgelöst
ConstraintViolationException
. Hier ist keine manuelle Arbeit erforderlich.Sie können auch Rückgabewerte überprüfen.
Ein weiterer wichtiger Vorteil von
javax.validation.constraints.NotNull
Comming for Beans Validation Framework besteht darin, dass es derzeit noch entwickelt wird und neue Funktionen für die neue Version 2.0 geplant sind.Was ist mit
@Nullable
? In Beans Validation 1.1 gibt es nichts Vergleichbares. Nun, ich könnte argumentieren, dass, wenn Sie sich für die Verwendung entscheiden,@NotNull
alles, was NICHT mit Anmerkungen versehen@NonNull
ist, effektiv "nullbar" ist, sodass die@Nullable
Anmerkung unbrauchbar ist.quelle
Spring 5 hat @NonNullApi auf Paketebene. Dies scheint eine bequeme Wahl für ein Projekt zu sein, das bereits Spring-Abhängigkeiten aufweist. Alle Felder, Parameter und Rückgabewerte, die standardmäßig @NonNull und @Nullable sind, können an den wenigen Stellen angewendet werden, die sich unterscheiden.
Datei package-info.java:
https://docs.spring.io/spring-data/commons/docs/current/reference/html/#repositories.nullability.annotations
quelle