Zaczęliśmy używać FindBugs i odpowiednio dodawać adnotacje do naszych parametrów @Nonnull
, i świetnie jest wskazywać błędy na wczesnym etapie cyklu. Do tej pory sprawdzaliśmy te argumenty za null
użyciem Guawy checkNotNull
, ale wolałbym sprawdzać null
tylko na krawędziach - miejscach, w których wartość może przyjść bez sprawdzania null
, np. Żądania SOAP.
// 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?
}
Rozumiem, że same wartości @Nonnull
nie są blokowane null
.
Biorąc jednak pod uwagę, że FindBugs będzie wskazywał, gdziekolwiek wartość jest przenoszona z pola nieoznaczonego do pola oznaczonego @Nonnull
, nie możemy polegać na tym, aby wychwytywać te przypadki (co robi) bez konieczności sprawdzania tych wartości w null
każdym miejscu, w którym są przekazywane system? Czy naiwnie chcę zaufać narzędziu i unikać pełnych kontroli?
Konkluzja: Chociaż usunięcie drugiej null
kontroli poniżej wydaje się bezpieczne, czy jest to zła praktyka?
To pytanie jest być może zbyt podobne do opcji Należy sprawdzić, czy nie ma wartości null , jeśli nie spodziewa się wartości null , ale pytam konkretnie w odniesieniu do @Nonnull
adnotacji.
@Nonnull
: jako specyfikacji kontraktu. Usuwam kontrole obronne wynikające z kontraktu i do tej pory nie miałem żadnych problemów.Zastanów się, dlaczego nie piszesz
Programowanie nie jest czarną magią. Zmienne nie stają się nagle zerowe. Jeśli wiesz, że zmienna nie ma wartości Null i wiesz, że nie została zmieniona, nie sprawdzaj jej.
Jeśli to zrobisz, jakiś programista w przyszłości (być może ty) poświęci dużo czasu, aby dowiedzieć się, dlaczego ta kontrola jest dostępna. W końcu czek musi być z jakiegoś powodu, więc czego przeoczysz?
źródło
@Nonnull
przewiduje umowa, że dzwoniący nie musi przechodzićnull
do konstruktora i FindBugs wykorzystuje analizę statyczną zlokalizować połączenia, które może pozwoląnull
--specifically połączeń, które przechodzą wartości nieoznaczone@Nonnull
siebie. Ale dzwoniący może przejśćnull
i zignorować ostrzeżenie FindBugs.