Chcę uczynić mój kod bardziej czytelnym, a także użyć narzędzi takich jak kontrola kodu IDE i / lub analiza kodu statycznego (FindBugs i Sonar), aby uniknąć wyjątków NullPointerExceptions. Wiele narzędzi wydają się sprzeczne ze sobą innych @NotNull
/ @NonNull
/ @Nonnull
adnotacji wystawianie ich wszystkich w moim kodu byłoby straszne czytać. Jakieś sugestie, który z nich jest „najlepszy”? Oto lista równorzędnych adnotacji, które znalazłem:
javax.validation.constraints.NotNull
Stworzony do weryfikacji środowiska wykonawczego, a nie analizy statycznej.
dokumentacjaedu.umd.cs.findbugs.annotations.NonNull
Używany przez Findbugs analizy statycznej i dlatego Sonar (obecnie Sonarqube )
dokumentacjijavax.annotation.Nonnull
Może to również działać z Findbugs, ale JSR-305 jest nieaktywny. (Zobacz także: Jaki jest status JSR 305? ) Źródłoorg.jetbrains.annotations.NotNull
Używany przez IntelliJ IDEA IDE do analizy statycznej.
dokumentacjalombok.NonNull
Służy do sterowania generowaniem kodu w Project Lombok .
Adnotacja zastępcza, ponieważ nie ma standardu.
źródło , dokumentacjaandroid.support.annotation.NonNull
Adnotacja znacznika dostępna w systemie Android, dostarczona w dokumentacji pakietu wsparcia-adnotacji
org.eclipse.jdt.annotation.NonNull
Używany przez Eclipse do dokumentacji statycznej analizy kodu
źródło
com.sun.istack.internal.NotNull
. OMG ...Odpowiedzi:
Ponieważ JSR 305 (którego celem była standaryzacja
@NonNull
i@Nullable
) był nieaktywny od kilku lat, obawiam się, że nie ma dobrej odpowiedzi. Wszystko, co możemy zrobić, to znaleźć pragmatyczne rozwiązanie, a moje jest następujące:Składnia
Z czysto stylistycznego punktu widzenia chciałbym uniknąć jakiegokolwiek odniesienia do IDE, frameworka lub jakiegokolwiek zestawu narzędzi oprócz samego Java.
Wyklucza to:
android.support.annotation
edu.umd.cs.findbugs.annotations
org.eclipse.jdt.annotation
org.jetbrains.annotations
org.checkerframework.checker.nullness.qual
lombok.NonNull
Który pozostawia nam albo
javax.validation.constraints
albojavax.annotation
. Ten pierwszy pochodzi z JEE. Jeśli jest to lepsze niżjavax.annotation
, co może ostatecznie przynieść JSE lub wcale, jest kwestią do dyskusji. Osobiście wolę,javax.annotation
ponieważ nie chciałbym zależności JEE.To nas zostawia
javax.annotation
który jest również najkrótszy.
Jest tylko jeden składnia co byłoby jeszcze lepiej:
java.annotation.Nullable
. Jak inne pakiety ukończyłjavax
abyjava
w przeszłości javax.annotation byłby to krok we właściwym kierunku.Realizacja
Miałem nadzieję, że wszystkie mają w zasadzie tę samą trywialną implementację, ale szczegółowa analiza wykazała, że to nieprawda.
Najpierw podobieństwa:
Wszystkie
@NonNull
adnotacje mają linięz wyjątkiem
org.jetbrains.annotations
który to nazywa@NotNull
i ma trywialną implementacjęjavax.annotation
który ma dłuższą implementacjęjavax.validation.constraints
który również to nazywa@NotNull
i ma implementacjęWszystkie
@Nullable
adnotacje mają linięz wyjątkiem (ponownie)
org.jetbrains.annotations
z ich trywialną implementacją.Różnice:
Uderzające jest to
javax.annotation
javax.validation.constraints
org.checkerframework.checker.nullness.qual
wszystkie mają adnotacje środowiska wykonawczego (
@Retention(RUNTIME)
), podczas gdyandroid.support.annotation
edu.umd.cs.findbugs.annotations
org.eclipse.jdt.annotation
org.jetbrains.annotations
są tylko czasem kompilacji (
@Retention(CLASS)
).Jak opisano w tej odpowiedzi SO, wpływ adnotacji środowiska wykonawczego jest mniejszy, niż mogłoby się wydawać, ale mają one tę zaletę, że oprócz narzędzi do kompilacji mają także możliwość przeprowadzania kontroli środowiska wykonawczego.
Inną ważną różnicą jest to, gdzie w kodzie można używać adnotacji. Istnieją dwa różne podejścia. Niektóre pakiety używają kontekstów w stylu JLS 9.6.4.1. Poniższa tabela zawiera przegląd:
org.eclipse.jdt.annotation
,javax.annotation
Iorg.checkerframework.checker.nullness.qual
użyć konteksty określonych w JLS 4.11, co jest moim zdaniem dobry sposób, żeby to zrobić.To nas zostawia
javax.annotation
org.checkerframework.checker.nullness.qual
w tej rundzie.
Kod
Aby pomóc Ci porównać dalsze szczegóły, poniżej zamieszczam kod każdej adnotacji. Aby ułatwić porównywanie, usunąłem komentarze, import i
@Documented
adnotacje. (wszyscy mieli@Documented
oprócz zajęć z pakietu Androida). Zmieniłem kolejność linii i@Target
pól oraz znormalizowałem kwalifikacje.Dla kompletności, oto
@Nullable
implementacje:Poniższe dwa pakiety nie mają
@Nullable
, więc wymieniam je osobno; Lombok jest dość nudny@NonNull
. W jest w rzeczywistości i ma dość długi wdrożenia.javax.validation.constraints
@NonNull
@NotNull
Wsparcie
Z mojego doświadczenia
javax.annotation
wynika , że jest co najmniej obsługiwany przez Eclipse i Checker Framework od razu po wyjęciu z pudełka.Podsumowanie
Moją idealną adnotacją byłaby
java.annotation
składnia z implementacją Checker Framework.Jeśli nie zamierzasz korzystać z Checker Framework,
javax.annotation
( JSR-305 ) jest na razie najlepszym wyborem.Jeśli chcesz kupić w Checker Framework, skorzystaj z nich
org.checkerframework.checker.nullness.qual
.Źródła
android.support.annotation
odandroid-5.1.1_r1.jar
edu.umd.cs.findbugs.annotations
odfindbugs-annotations-1.0.0.jar
org.eclipse.jdt.annotation
odorg.eclipse.jdt.annotation_2.1.0.v20160418-1457.jar
org.jetbrains.annotations
odjetbrains-annotations-13.0.jar
javax.annotation
odgwt-dev-2.5.1-sources.jar
org.checkerframework.checker.nullness.qual
odchecker-framework-2.1.9.zip
lombok
zlombok
zatwierdzeniaf6da35e4c4f3305ecd1b415e2ab1b9ef8a9120b4
javax.validation.constraints
odvalidation-api-1.0.0.GA-sources.jar
źródło
javax.annotation
jest to, że a) opiera się na martwym JSR, b) ciężko znaleźć artefakt, który tylko zapewnia adnotacje i jest utrzymywany. Ten z findbugs nie jest: search.maven.org/…javax.annotation
jest to, że powoduje problemy z Javą 9, ponieważ inne moduły również udostępniają klasy w tym pakiecie (jax-ws).javax.annotation.NonNull
, nigdy nie został ukończony, ponieważ jego wiodąca specyfikacja przeszła AWOL. Nie miało to nic wspólnego z decyzją Oracle.Bardzo podoba mi się Checker Framework , który jest implementacją adnotacji typu ( JSR-308 ), która służy do implementacji sprawdzania defektów, takich jak sprawdzanie nullness. Tak naprawdę nie próbowałem nikogo oferować żadnego porównania, ale jestem zadowolony z tej implementacji.
Nie jestem związany z grupą, która oferuje oprogramowanie, ale jestem fanem.
Cztery rzeczy, które lubię w tym systemie:
Ma sprawdzanie defektów pod kątem nieważności (@Nullable), ale ma także niezmienność i internowanie (i inne). Używam pierwszego (zerowanie) i próbuję zacząć używać drugiego (niezmienność / IGJ). Próbuję trzeciego, ale nie jestem pewien, czy będę go używać długoterminowo. Nie jestem jeszcze przekonany o ogólnej przydatności innych kontrolerów, ale miło jest wiedzieć, że sam framework jest systemem do wdrażania wielu dodatkowych adnotacji i kontrolerów.
Ustawienie domyślne dla sprawdzenia nullness działa dobrze: niezerowe wyjątkiem mieszkańców (NNEL). Zasadniczo oznacza to, że domyślnie moduł sprawdzający traktuje wszystko (zmienne instancji, parametry metody, typy ogólne itp.) Oprócz zmiennych lokalnych tak, jakby miały domyślnie typ @NonNull. Według dokumentacji:
Możesz ustawić inną wartość domyślną dla klasy lub metody, jeśli NNEL nie działa dla Ciebie.
Framework ten pozwala na używanie bez tworzenia zależności od frameworka poprzez umieszczanie adnotacji w komentarzu: np
/*@Nullable*/
. Jest to miłe, ponieważ możesz dodawać adnotacje i sprawdzać bibliotekę lub kod współdzielony, ale nadal możesz korzystać z tej biblioteki / kodu współdzielonego w innym projekcie, który nie korzysta z frameworka. To miła funkcja. Przyzwyczaiłem się do korzystania z niego, mimo że teraz włączam Checker Framework we wszystkich moich projektach.Struktura ma sposób na opisywanie używanych interfejsów API , które nie są jeszcze opatrzone adnotacjami o null, za pomocą plików pośredniczących.
źródło
Korzystam z IntelliJ, ponieważ najbardziej interesuje mnie oznaczanie przez IntelliJ rzeczy, które mogą produkować NPE. Zgadzam się, że frustrujące jest brak standardowych adnotacji w JDK. Mówi się o dodaniu go, może to zrobić w Javie 7. W takim przypadku będzie jeszcze jeden do wyboru!
źródło
javax.annotation.Nonnull
jest szerzej akceptowany, prawda?Zgodnie z listą funkcji Java 7 adnotacje typu JSR-308 są odroczone do Java 8. Adnotacje JSR-305 nie są nawet wspomniane.
Trochę informacji o stanie JSR-305 znajduje się w załączniku do najnowszej wersji JSR-308. Obejmuje to spostrzeżenie, że adnotacje JSR-305 wydają się być porzucone. Strona JSR-305 również pokazuje ją jako „nieaktywną”.
Tymczasem pragmatyczną odpowiedzią jest użycie typów adnotacji obsługiwanych przez najczęściej używane narzędzia ... i być przygotowanym na ich zmianę, jeśli sytuacja się zmieni.
W rzeczywistości JSR-308 nie definiuje żadnych typów / klas adnotacji i wygląda na to, że uważają, że jest poza zakresem. (I mają rację, biorąc pod uwagę istnienie JSR-305).
Jeśli jednak JSR-308 naprawdę wygląda na przejście do Javy 8, nie zaskoczyłoby mnie, gdyby zainteresowanie JSR-305 wzrosło. AFAIK, zespół JSR-305 formalnie nie porzucił swojej pracy. Po prostu milczą od ponad 2 lat.
Interesujące jest to, że Bill Pugh (lider technologiczny w JSR-305) jest jednym z ludzi stojących za FindBugs.
źródło
W przypadku projektów na Androida powinieneś użyć
android.support.annotation.NonNull
iandroid.support.annotation.Nullable
. Te i inne pomocne adnotacje specyficzne dla Androida są dostępne w Bibliotece pomocy .Od http://tools.android.com/tech-docs/support-annotations :
źródło
javax.annotation.*
adnotacjamiJeśli ktoś szuka tylko klas IntelliJ: możesz je pobrać z repozytorium maven za pomocą
źródło
JSR305 i FindBugs są autorstwa tej samej osoby. Oba są źle utrzymane, ale są tak standardowe, jak to możliwe i są obsługiwane przez wszystkie główne środowiska IDE. Dobra wiadomość jest taka, że działają dobrze takie, jakie są.
Oto jak domyślnie zastosować @Nonnull do wszystkich klas, metod i pól. Zobacz https://stackoverflow.com/a/13319541/14731 i https://stackoverflow.com/a/9256595/14731
@NotNullByDefault
2. Dodaj adnotację do każdego pakietu:
package-info.java
AKTUALIZACJA : Od 12 grudnia 2012 r. JSR 305 jest wymieniony jako „Uśpiony”. Zgodnie z dokumentacją:
Wygląda na to, JSR 308 jest co czyni go w JDK 8 i chociaż JSR nie definiuje @NotNull, towarzyszący mu
Checkers Framework
robi. W chwili pisania tego tekstu wtyczka Maven nie nadaje się do użytku z powodu tego błędu: https://github.com/typetools/checker-framework/issues/183źródło
Rozróżnij analizę statyczną i analizę czasu wykonywania. Użyj analizy statycznej dla wewnętrznych elementów i analizy środowiska wykonawczego dla publicznych granic twojego kodu.
Dla rzeczy, które nie powinny być zerowe:
Kontrola działania: Użyj „if (x == null) ...” (zależność od zera) lub @ javax.validation.NotNull (z weryfikacją komponentu bean) lub @ lombok.NonNull (zwykły i prosty) lub guavas Preconditions.checkNotNull (.. .)
Kontrola statyczna: użyj adnotacji @NonNull
To powinno dać najlepszy wynik: ostrzeżenia w IDE, błędy Findbugs i checkerframework, znaczące wyjątki czasu wykonywania.
Nie oczekuj, że testy statyczne będą dojrzałe, ich nazewnictwo nie jest ustandaryzowane, a różne biblioteki i środowiska IDE traktują je inaczej, ignoruj je. Klasy javax.annotations. * JSR305 wyglądają jak standardowe, ale nie są i powodują podział pakietów w Javie +.
Objaśnienia niektórych notatek:
Przed Java9 to moja rekomendacja:
Zauważ, że nie ma sposobu, aby Spotbugs wyświetlał ostrzeżenie, gdy parametr metody zerowalnej jest zaniedbany (w momencie pisania, wersja 3.1 Spotbugs). Może może to zrobić checkerframework.
Niestety, te adnotacje nie rozróżniają przypadków publicznej metody biblioteki z dowolnymi wywołaniami wywoławczymi i niepublicznych metod, w których każda strona wywoławcza może być znana. Podwójne znaczenie: „Wskazuj, że wartość null jest niepożądana, ale mimo wszystko przygotuj się na przekazanie wartości null” nie jest możliwe w pojedynczej deklaracji, stąd powyższy przykład zawiera różne adnotacje dla interfejsu i implementacji.
W przypadkach, w których podejście z podziałem interfejsu nie jest praktyczne, następujące podejście jest kompromisem:
Pomaga to klientom nie przekazywać wartości null (pisanie poprawnego kodu), a jeśli tak, zwracają przydatne błędy.
źródło
Eclipse ma także własne adnotacje.
Szczegółowe informacje można znaleźć na stronie http://wiki.eclipse.org/JDT_Core/Null_Analysis .
źródło
Wskazując tylko, że Java Validation API (
javax.validation.constraints.*
) nie zawiera@Nullable
adnotacji, która jest bardzo cenna w kontekście analizy statycznej. Ma to sens w przypadku sprawdzania poprawności komponentów środowiska uruchomieniowego, ponieważ jest to ustawienie domyślne dla dowolnego nieprecyzyjnego pola w Javie (tj. Nic do sprawdzania poprawności / egzekwowania). Do celów określonych, które powinny ważyć w kierunku alternatyw.źródło
Niestety,
JSR 308
nie doda tutaj więcej wartości niż lokalna propozycja tego projektuJava 8
nie będzie zawierał ani jednej domyślnej adnotacji ani własnejChecker
struktury. Podobnie jak w przypadku błędów Find lubJSR 305
ten JSR jest źle obsługiwany przez niewielką grupę zespołów akademickich.Nie kryje się za tym żadna komercyjna moc, dlatego
JSR 308
uruchamiaEDR 3
(Early Draft Review atJCP
) TERAZ, podczas gdyJava 8
ma zostać wysłany za mniej niż 6 miesięcy: -O Podobny do310
btw. ale w przeciwieństwie do308 Oracle
tego przejął to teraz od swoich założycieli, aby zminimalizować szkody wyrządzone platformie Java.Każdy projekt, sprzedawca i klasa akademicka, podobnie jak ci, którzy stoją za nimi
Checker Framework
iJSR 308
utworzą własną zastrzeżoną adnotację sprawdzającą.Wykonywanie kodu źródłowego za niezgodną na długie lata, aż można było znaleźć kilka popularnych kompromisy, a może dodany do
Java 9
lub10
, lub za pośrednictwem struktur, takich jakApache Commons
lubGoogle Guava
;-)źródło
Android
Ta odpowiedź jest specyficzna dla Androida. Android ma pakiet wsparcia o nazwie
support-annotations
. Zapewnia to dziesiątki adnotacji na Androida, a także typowe, takie jakNonNull
,Nullable
etc.Aby dodać pakiet wsparcia-adnotacji , dodaj następującą zależność w pliku build.gradle:
a następnie użyj:
źródło
Podczas oczekiwania na rozwiązanie tego problemu (Java 8?) Możesz również zdefiniować własny projekt lokalny
@NotNull
i@Nullable
adnotacje. Może to być przydatne również w przypadku pracy z Java SE, gdzie domyślniejavax.validation.constraints
nie jest dostępna .Byłoby to w dużej mierze przeznaczone do celów dekoracyjnych lub zabezpieczających na przyszłość, ponieważ powyższe oczywiście nie stanowi samo w sobie żadnego wsparcia dla analizy statycznej tych adnotacji.
źródło
Jeśli tworzysz dla Androida, jesteś trochę związany z Eclipse (edytuj: w chwili pisania tego tekstu, już nie), który ma własne adnotacje. Jest zawarty w Eclipse 3.8+ (Juno), ale domyślnie wyłączony.
Możesz go włączyć w Preferencje> Java> Kompilator> Błędy / Ostrzeżenia> Analiza zerowa (zwijana sekcja u dołu).
Zaznacz „Włącz analizę zerową opartą na adnotacjach”
http://wiki.eclipse.org/JDT_Core/Null_Analysis#Usage zawiera zalecenia dotyczące ustawień. Jeśli jednak masz w swoim obszarze roboczym zewnętrzne projekty (takie jak Facebook SDK), mogą one nie spełniać tych zaleceń i prawdopodobnie nie chcesz ich naprawiać przy każdej aktualizacji SDK ;-)
Używam:
źródło
@chaqke
.Jeśli pracujesz nad dużym projektem, możesz lepiej tworzyć własne
@Nullable
i / lub@NotNull
adnotacje.Na przykład:
Jeśli użyjesz prawidłowych zasad przechowywania , adnotacje nie będą dostępne w czasie wykonywania . Z tego punktu widzenia jest to tylko kwestia wewnętrzna kwestia .
Chociaż nie jest to ścisła nauka, myślę, że najbardziej sensowne jest użycie do tego klasy wewnętrznej .
@Nullable
/@NotNull
adnotacje.Dodatkowe pytania (patrz komentarze):
Jak to skonfigurować w IntelliJ?
źródło
idea
nie mów nic ovoid test(@NonNull String s) {}
test(null);
Tutaj jest już zbyt wiele odpowiedzi, ale (a) to 2019 rok i nadal nie ma „standardu”
Nullable
i (b) żadne inne odniesienia nie odnoszą się do Kotlina.Odniesienie do Kotlin jest ważne, ponieważ Kotlin jest w 100% interoperacyjny z Javą i ma podstawową funkcję Null Safety. Podczas wywoływania bibliotek Java może skorzystać z tych adnotacji, aby poinformować narzędzia Kotlin, czy interfejs API Java może zaakceptować lub zwrócić
null
.O ile mi wiadomo, jedynymi
Nullable
pakietami kompatybilnymi z Kotlin sąorg.jetbrains.annotations
iandroid.support.annotation
(terazandroidx.annotation
). Ta ostatnia jest kompatybilna tylko z Androidem, więc nie można jej używać w projektach JVM / Java / Kotlin w wersji innej niż Android. Jednak pakiet JetBrains działa wszędzie.Jeśli więc opracujesz pakiety Java, które powinny również działać w Androidzie i Kotlinie (i będą obsługiwane przez Android Studio i IntelliJ), najlepszym wyborem jest prawdopodobnie pakiet JetBrains.
Maven:
Stopień:
źródło
Jest inny sposób, aby to zrobić w Javie 8. Robię 2 rzeczy, aby osiągnąć to, czego potrzebowałem:
java.util.Optional
java.util.Objects.requireNonNull
Przykład:
Więc moje pytanie brzmi: czy potrzebujemy adnotacji podczas korzystania z Java 8?
Edycja: Dowiedziałem się później, że niektórzy uważają za złą praktykę stosowanie
Optional
argumentów, tutaj jest dobra dyskusja z zaletami i wadami Dlaczego nie należy używać Opcji Java 8 w argumentachAlternatywna opcja, biorąc pod uwagę, że nie jest zalecane używanie Opcjonalne w argumentach, potrzebujemy 2 konstruktorów:
źródło
new Role(null,null,null,null);
. Dzięki adnotacjom moje IDE i analiza statyczna ostrzegą, że wartości zerowe nie mogą zostać przekazane do tych parametrów. Bez tego nie dowiem się, dopóki nie uruchomię kodu. To jest wartość adnotacji.description
nie mieć wartości null, a kod klienta może przekazać pusty ciąg, ale w wielu przypadkach przydatne może być rozróżnienie między pustym ciągiem i nieposiadanie wartości. Dzięki za komentarz. Zaktualizuję odpowiedź.Czy słońce nie ma teraz własnego? Co to jest:
http://www.java2s.com/Open-Source/Java-Document/6.0-JDK-Modules-com.sun/istack/com.sun.istack.internal.htm
Wygląda na to, że zawiera wszystkie wersje Javy, z których korzystałem w ciągu ostatnich kilku lat.
Edycja: Jak wspomniano w komentarzach poniżej, prawdopodobnie nie chcesz ich używać. W takim przypadku głosuję za adnotacjami odrzutowca IntelliJ!
źródło
Jedną z fajnych rzeczy w IntelliJ jest to, że nie trzeba używać ich adnotacji. Możesz pisać własne lub korzystać z dowolnego innego narzędzia, które ci się podoba. Nie jesteś nawet ograniczony do jednego typu. Jeśli używasz dwóch bibliotek, które używają różnych adnotacji @NotNull, możesz powiedzieć IntelliJ, aby używał obu z nich. Aby to zrobić, przejdź do „Konfiguruj inspekcje”, kliknij inspekcję „Stałe warunki i wyjątki” i naciśnij przycisk „Konfiguruj inspekcje”. Korzystam z Nullness Checker, gdzie tylko mogę, więc skonfigurowałem IntelliJ do używania tych adnotacji, ale możesz sprawić, że będzie działał z każdym innym narzędziem, które chcesz. (Nie mam zdania na temat innych narzędzi, ponieważ od lat korzystam z inspekcji IntelliJ i uwielbiam je).
źródło
Inną opcją są adnotacje dostarczane z ANTLR 4. Po otrzymaniu żądania ściągnięcia # 434 artefakt zawierający adnotacje
@NotNull
i@Nullable
zawiera procesor adnotacji, który generuje błędy kompilacji i / lub ostrzeżenia w przypadku niewłaściwego użycia jednego z tych atrybutów (na przykład, jeśli oba są stosowane do tego samego elementu lub jeśli@Nullable
stosuje się do elementu z typem pierwotnym). Procesor adnotacji zapewnia dodatkową pewność podczas procesu tworzenia oprogramowania, że informacje przekazywane przez zastosowanie tych adnotacji są dokładne, w tym w przypadku dziedziczenia metody.źródło
Jeśli budujesz swoją aplikację za pomocą Spring Framework, sugerowałbym użycie
javax.validation.constraints.NotNull
pochodzącego z Beans Validation spakowanego w następującej zależności:Główną zaletą tej adnotacji jest to, że Spring obsługuje zarówno parametry metody, jak i pola klasy opatrzone adnotacjami
javax.validation.constraints.NotNull
. Aby włączyć obsługę, wystarczy:dostarcz słoik interfejsu API do sprawdzania poprawności ziaren i słoik z implementacją walidatora adnotacji jsr-303 / jsr-349 (która jest zależna od Hibernacji Validatora 5.x):
dostarczyć MethodValidationPostProcessor do kontekstu wiosny
w końcu adnotujesz swoje zajęcia wiosną,
org.springframework.validation.annotation.Validated
a walidacja zostanie automatycznie przeprowadzona przez Spring.Przykład:
Gdy spróbujesz wywołać metodę doSomething i podać wartość null jako wartość parametru, sprężyna (za pomocą HibernateValidator) wyrzuci
ConstraintViolationException
. Nie ma tu potrzeby ręcznej pracy.Możesz również sprawdzić wartości zwracane.
Kolejną ważną korzyścią
javax.validation.constraints.NotNull
związaną z pojawieniem się Beans Validation Framework jest to, że w tej chwili jest on nadal rozwijany i planowane są nowe funkcje dla nowej wersji 2.0.Co
@Nullable
? Nie ma nic takiego w Beans Validation 1.1. Cóż, mógłbym argumentować, że jeśli zdecydujesz się na użycie,@NotNull
wszystko, co NIE jest opatrzone adnotacjami,@NonNull
jest w rzeczywistości „zerowalne”, więc@Nullable
adnotacja jest bezużyteczna.źródło
Wiosna 5 ma @NonNullApi na poziomie pakietu. To wydaje się wygodnym wyborem dla projektu, który ma już zależności Spring. Wszystkie pola, parametry i zwracane wartości domyślnie to @NonNull i @Nullable można zastosować w kilku różnych miejscach.
Plik pakiet-info.java:
https://docs.spring.io/spring-data/commons/docs/current/reference/html/#repositories.nullability.annotations
źródło