2012-12-28 8 views
228

Widziałem niektóre metody w java zadeklarowane jako:@Nullable Wykorzystanie adnotacji

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

Co to ma znaczyć @Nullable tutaj? Czy to znaczy, że wejście może być null? Bez adnotacji dane wejściowe mogą nadal mieć wartość null, więc myślę, że to nie tylko to?

Dzięki

+2

Z poniższych odpowiedzi, nauczyłem się, że adnotacja wskazuje wartości null są dopuszczalne, przykłady, gdzie jest on stosowany, analizatory kod mogę wypróbować i interpretacje mogą się różnić. Zobacz, dlaczego ten format jest dobry? + 1 s przez cały czas, szczególnie za zadanie tego pytania. – icedwater

+2

Która biblioteka udostępnia '@ Nullable' w kontekście twojego pytania? Czy to jest [Checker?] (Https://checkerframework.org/manual/#nullness-checker) – 8bitjunkie

Odpowiedz

252

To wyjaśnia, że ​​metoda przyjmuje wartości NULL, i że jeśli zastąpić metodę, należy również przyjmować wartości NULL.

Służy także jako podpowiedź dla analizatorów kodu, takich jak FindBugs. Na przykład, jeśli taka metoda usunie jej argument bez sprawdzenia wartości zerowej, FindBugs wyśle ​​ostrzeżenie.

+9

http://findbugs.sourceforge.net/ – MrSmith42

64

Ta adnotacja jest powszechnie używana w celu wyeliminowania NullPointerExceptions. @Nullable często mówi się, że ten parametr może być null. Dobry przykład takiego zachowania można znaleźć w Google Guice. W tym lekkim szkielecie zależności wtrysku informujemy, że ta zależność może być null. Jeśli spróbujesz przekazać null i bez adnotacji, framework odmówi wykonania tej pracy.

Co więcej, można użyć @Nullable z adnotacją @NotNull. Tutaj możesz find kilka wskazówek, jak prawidłowo ich używać. Inspekcja kodu w IntelliJ sprawdza adnotacje i pomaga w debugowaniu kodu.

6

Element oznaczony @Nullable twierdzi, że wartość pusta jest całkowicie poprawna, aby zwrócić (dla metod), przejść do (dla parametrów) i przytrzymaj (dla zmiennych lokalnych i pól).

Element oznaczony @NotNull twierdzi, że zabronione jest zwracanie wartości pustej (dla metod), przekazywanie do (dla parametrów) i przytrzymanie (dla zmiennych lokalnych i pól).

Istnieje relacja kowariancji-kowariancji między @Nullable i @NotNull podczas przesłaniania/implementacji metod z adnotacjami deklaracji lub parametrów.

Zastępowanie/metod z adnotacjami deklaracji wykonawcze:

  • @NotNull adnotacja metody dominującej wymaga
    @NotNull adnotacji dla metody klasy dziecko.
  • Metody z @Nullable przypisaniem w sposobie macierzystego może mieć albo @Nullable lub @NotNull adnotacje klasy dziecko metody.

Zastępowanie/metod realizacji dodając opisane parametry:

  • @Nullable adnotacji parametrem sposobu macierzystego wymaga @Nullable Adnotacja metoda klasy dziecko parametru.
  • Metody z @NotNull adnotacji parametrem sposobu dominująca może mieć albo @Nullable lub @NotNull opisów (lub brak z nich) parametru metoda klasy dziecko.

przykład:

@Nullable 
public static UserContext getThreadUserContext() { 
    TransactionParms tp = TransactionParms.getBoundParms(); 
    return (tp == null) ? null : tp.getUserContext(); 
} 

tutaj getThreadUserContext metoda musi zwrócić wystąpienie TransactionParms. Bu że instancja może być Null