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 nullużyciem Guawy checkNotNull, ale wolałbym sprawdzać nulltylko 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 @Nonnullnie 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 nullkażdym miejscu, w którym są przekazywane system? Czy naiwnie chcę zaufać narzędziu i unikać pełnych kontroli?
Konkluzja: Chociaż usunięcie drugiej nullkontroli 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 @Nonnulladnotacji.
@Nonnull: jako specyfikacji kontraktu. Usuwam kontrole obronne wynikające z kontraktu i do tej pory nie miałem żadnych problemów.