Ich habe gerade angefangen, das zu benutzen @NotNull
Annotation mit Java 8 zu verwenden und einige unerwartete Ergebnisse zu erhalten.
Ich habe eine Methode wie diese:
public List<Found> findStuff(@NotNull List<Searching> searchingList) {
... code here ...
}
Ich habe einen JUnit-Test geschrieben, der den Nullwert für das Argument searchList übergeben hat. Ich hatte erwartet, dass ein Fehler auftritt, aber er ging durch, als ob die Anmerkung nicht vorhanden wäre. Ist das erwartetes Verhalten? Soweit ich verstanden habe, sollten Sie damit das Schreiben des Nullprüfcodes für das Boilerplate überspringen.
Eine Erklärung, was genau @NotNull tun soll, wäre sehr dankbar.
@NotNull
ist nur eine Anmerkung. Anmerkungen machen nichts für sich. Sie benötigen einen Annotationsprozessor zur Kompilierungszeit oder etwas, das ihn zur Laufzeit verarbeitet.Antworten:
@Nullable
und@NotNull
nichts alleine machen. Sie sollen als Dokumentationswerkzeuge dienen.Die
@Nullable
Anmerkung erinnert Sie an die Notwendigkeit, eine NPE-Prüfung einzuführen, wenn:Die
@NotNull
Anmerkung ist eigentlich ein ausdrücklicher Vertrag, der Folgendes erklärt:kann nichtnicht Null - Wert halten.Zum Beispiel anstatt zu schreiben:
Sie können verwenden:
Darüber hinaus
@NotNull
wird häufig von ConstraintValidators überprüft (z. B. im Frühjahr und im Ruhezustand).Die
@NotNull
Annotation führt keine eigene Validierung durch, da die Annotationsdefinition keine bereitstelltConstraintValidator
.Weitere Informationen finden Sie unter:
quelle
Optional
anstelle von@Null
Rückgabewerten und Methodenüberladung anstelle von@Null
Parameterlisten verwendet werden: dolszewski.com/java/java-8-optional-use-cases* The annotated element must not be {@code null}. * Accepts any type.
und ich denke, das Wort muss durch sollte ersetzt werden, aber es hängt wieder davon ab, wie Sie es lesen. Auf jeden Fall wären weitere Klarstellungen gut zu habennull
, dies aber zulässig wäre, verwenden Sie die Annotation falsch. Der Begriff bedeutet nicht, dass er validiert ist. Ein Hinweis, dass es nicht validiert ist, würde jedoch nicht schaden. Wenn Sie eine automatische Validierung hinzufügen möchten, können Sie einige externe Tools verwenden. Beispielsweise verfügt die IntelliJ- IDE über eine integrierte Unterstützung zum Einfügen von Nullprüfungen.Wie oben erwähnt
@NotNull
macht nichts für sich. Eine gute Art der Verwendung@NotNull
wäre die Verwendung mitObjects.requireNonNull
quelle
this.bar = Objects.requireNonNull(bar, "bar must not be null");
Um
@NotNull
aktiv zu werden, benötigen Sie Lombok:https://projectlombok.org/features/NonNull
Folgen Sie: Welche @NotNull Java-Annotation soll ich verwenden?
quelle
SO @NotNull ist nur ein Tag ... Wenn Sie es validieren möchten, müssen Sie so etwas wie den Ruhezustand-Validator jsr 303 verwenden
quelle
Wenn Sie Spring verwenden, können Sie die Validierung erzwingen, indem Sie die Klasse mit
@Validated
folgenden Anmerkungen versehen :Weitere Informationen finden Sie hier: Verwendung der Javax-Validierung @NotNull-Annotation
quelle
Ich mache das, um meine eigene Validierungsanmerkung und Validierung zu erstellen:
ValidCardType.java
(Anmerkung zum Anlegen von Methoden / Feldern)Und, um der Prüfer die Prüfung auslösen:
CardTypeValidator.java
:Sie können etwas sehr Ähnliches tun, um dies zu überprüfen
@NotNull
.quelle
Um Ihre Methodenvalidierung in einem Test zu testen, müssen Sie einen Proxy in die @ Before-Methode einbinden.
Mit MethodValidationProxyFactory als:
}}
Und dann fügen Sie Ihren Test hinzu:
quelle