Wir haben damit begonnen, FindBugs zu verwenden und unsere Parameter mit den @Nonnull
entsprechenden Anmerkungen zu versehen , und es ist großartig, früh im Zyklus auf Fehler hinzuweisen. Bisher haben wir diese Argumente weiterhin auf die null
Verwendung von Guava's checkNotNull
überprüft, aber ich würde es vorziehen, null
nur an den Rändern zu suchen - Stellen, an denen der Wert eingegeben werden kann, ohne auf z null
. B. eine SOAP-Anfrage geprüft worden zu sein .
// service layer accessible from outside
public Person createPerson(@CheckForNull String name) {
return new Person(Preconditions.checkNotNull(name));
}
...
// internal constructor accessed only by the service layer
public Person(@Nonnull String name) {
this.name = Preconditions.checkNotNull(name); // remove this check?
}
Ich verstehe, dass @Nonnull
sich null
Werte nicht blockieren .
Da FindBugs jedoch darauf hinweist, dass irgendwo ein Wert von einem nicht markierten Feld in ein markiertes Feld übertragen wird @Nonnull
, können wir uns nicht darauf verlassen, dass diese Fälle abgefangen werden (was auch immer der Fall ist), ohne dass diese Werte null
überall überprüft werden müssen, wo sie herumgereicht werden das System? Bin ich naiv, wenn ich dem Tool vertrauen und diese ausführlichen Überprüfungen vermeiden möchte?
Fazit: Obwohl es sicher erscheint, den zweiten null
Haken unten zu entfernen , ist es eine schlechte Praxis?
Diese Frage ist vielleicht zu ähnlich wie Sollte man auf null prüfen, wenn er nicht null erwartet , aber ich frage speziell in Bezug auf die @Nonnull
Anmerkung.
@Nonnull
: als Vertragsspezifikation. Ich habe die defensiven Schecks hinter dem Vertrag entfernt und bis jetzt keine Probleme gehabt.Überlegen Sie, warum Sie nicht schreiben
Programmieren ist keine schwarze Magie. Variablen werden nicht plötzlich zu Null. Wenn Sie eine Variable wissen , ist nicht Null, und Sie wissen , dass es nicht geändert wird , dann kann nicht überprüfen Sie es.
Wenn Sie es überprüfen, werden einige Programmierer in der Zukunft (möglicherweise Sie) viel Zeit damit verbringen, herauszufinden, warum diese Überprüfung vorhanden ist. Der Scheck muss doch aus einem Grund da sein, also was übersehen Sie?
quelle
@Nonnull
Vertrag sieht vor, dass Aufrufer nichtnull
an den Konstruktor übergeben werden dürfen, und FindBugs verwendet eine statische Analyse, um Aufrufe zu finden, dienull
--spezifisch Aufrufe zulassen , die Werte übergeben, die@Nonnull
selbst nicht markiert sind. Es steht dem Anrufer jedoch freinull
, die Warnung von FindBugs zu ignorieren.