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.