@ Użycie pustej adnotacji

347

Widziałem jakąś metodę w Javie zadeklarowaną jako:

void foo(@Nullable Object obj)
{ ... }

Jakie jest znaczenie tego @Nullabletutaj? Czy to oznacza, że ​​wkład może być null?

Bez adnotacji dane wejściowe nadal mogą być zerowe, więc myślę, że to nie tylko to?

użytkownik1508893
źródło
3
Z poniższych odpowiedzi dowiedziałem się, że adnotacja wskazuje, że dopuszczalne są wartości zerowe, przykłady użycia, analizatory kodów, które mogę wypróbować i że interpretacje mogą się różnić. Zobacz, dlaczego ten format jest dobry? +1 dookoła, szczególnie za zadawanie tego pytania.
icedwater
8
Która biblioteka jest dostępna @Nullablew kontekście twojego pytania? Czy to Checker?
8bitjunkie 4.04.17

Odpowiedzi:

367

Wyjaśnia, że ​​metoda akceptuje wartości zerowe i że jeśli przesłonisz metodę, powinieneś również zaakceptować wartości zerowe.

Służy również jako wskazówka dla analizatorów kodu, takich jak FindBugs . Na przykład, jeśli taka metoda odrzuci swój argument, nie sprawdzając najpierw wartości null, FindBugs wyświetli ostrzeżenie.

JB Nizet
źródło
82

Ta adnotacja jest powszechnie stosowana w celu wyeliminowania NullPointerExceptions. @Nullablemówi, że ten parametr może być null. Dobry przykład takiego zachowania można znaleźć w Google Guice . W tej lekkiej strukturze wstrzykiwania zależności można stwierdzić, że ta zależność może być null. Jeśli spróbujesz przejść nullbez adnotacji, framework odmówi wykonania swojej pracy.

Co więcej, @Nullablemożna użyć z @NotNulladnotacjami. Tutaj znajdziesz kilka wskazówek, jak prawidłowo z nich korzystać. Kontrola kodu w IntelliJ sprawdza adnotacje i pomaga debugować kod.

Adam Sznajder
źródło
1

To prawda, że ​​w moim świecie są zdecydowanie inne sposoby myślenia, nie mogę egzekwować „Nigdy nie zerwać wartości zerowej”, ponieważ mam do czynienia z niekontrolowanymi stronami trzecimi, takimi jak wywołujące API, rekordy baz danych, byli programiści itp., Więc jestem paranoiczny i defensywny w podejściach. . Ponieważ korzystasz z Java8 lub nowszej wersji, jest nieco czystsze podejście niż ifblok.

public String foo(@Nullable String mayBeNothing) {
   return Optional.ofNullable(mayBeNothing).orElse("Really Nothing");
}

Możesz także zgłosić wyjątek, zamieniając .orElsena orElseThrow(() -> new Exception("Dont' send a null")).

Jeśli nie chcesz używać @Nullable, który nie dodaje nic funkcjonalnie, dlaczego nie nazwać parametru mayBe...tak, aby Twoja intencja była jasna.

Manabu Tokunaga
źródło