Java în sine nu este livrat cu aceste adnotări.
În schimb, există aproximativ 10 reciproc incompatibile ia pe ideea, dintre care cele mai multe de lucru complet diferit și se aplică sensuri diferite a ceea ce NonNull
înseamnă, în cazul în care vă puteți pune, și cum funcționează.
Oof. Acest lucru este foarte regretabil ca idee de bază, folosind adnotări pentru a adăuga aceste informații este mult superioară față de Opțional și astfel, având în vedere că acesta ar fi în întregime compatibil și nu retrograda cod existent în deprimat de obsolecence, spre deosebire de Optional
.
Deci, găsi unul care vă place, și-l includă în proiectul dumneavoastră același mod în care include orice terță parte de dependență - de obicei, prin includerea în Maven/Gradle/Ant+ivy/etc (construi dvs. de fișier este lista de dependențe).
Intellij are propriile ia pe NonNull și poate fi nul. Este, probabil, cel mai convenabil. Ideile sale despre ceea ce aceste adnotări adică sunt inferioare1. Checker-Cadru este cel mai bun, eclipse este o distanță de al doilea cel mai bun, și orice altceva (inclusiv intellij e) acțiuni locul al treilea loc. cel mai bun ia este de a fi găsit în Checker-Cadru, sau, aproape la fel de bun, eclipsa se ia de pe aceste adnotări. Cu toate acestea, mă îndoiesc intellij e nul verificarea sisteme sunt capabile de a înțelege pe deplin sale mai avansate completări, cum ar fi @PolyNull
, astfel încât această suplimentare de putere expresivă ar fi cea mai mare parte pierdut. Ca un bonus, intellij navele cu o grămadă de date despre ceea ce dreptul nulitatea adnotări ar fi pe marile biblioteci.
Ultima e important: cel Mai frecvent utilizate biblioteci java, inclusiv java.*
în sine, nu are aceste adnotări, și lucrează cu jumătate de null-codul adnotat este cu siguranță un foarte frustrant exercițiu; costurile de a face asta mult mai mari decât beneficiile. Singura soluție reală este de a "rezolva" bibliotecile utilizați cu nulitatea info, dar asta e o grămadă de muncă. Din fericire, intellij a făcut o mulțime de ea pentru tine.
Mi-ar aștepta (eclipsa face acest lucru), că quickfix (CMD+1 pe mac-uri, CTRL+1 pe non-macs, cel puțin, afară de la cutie daca memoria mea de scurtături de la tastatură implicite mă servește) include în mod automat adăuga eclipse este nulitatea adnotări la classpath' (sau, în cazul tău, intellij, desigur). Dacă cumva nu apare, Această pagină de intellij docs explica exact cum să adăugați org.jetbrains.annotations
bibliotecă, care conține lor nulitatea adnotări, pentru proiectul dumneavoastră. În fapt, aceste documente indică faptul că, într-adevăr, quickfix meniu nu vă oferă opțiunea de adăugarea în mod automat această bibliotecă ca soluție la eroare ai pe @NonNull
nod în codul sursă.
[1] cele Mai duce la nulitatea adnotări limiteze considerabil, permițând adnotare numai pe câmpuri, metode (ceea ce presupune: Ce se întoarce), și parametrii. Cu toate acestea, o poate avea un categoric-nu-nul List
de-ar-fi-nul Map
cazuri, ceea ce arată Hartă cu siguranta nu este null String
pentru a putea fi null Integer
: @NonNull List<@Nullable Map<@NonNull String, @Nullable Integer>>
. Sistemul de adnotări este capabil de a permițându-vă să scrie asta, dar numai dacă adnotări sunt stabilite exclusiv pentru TYPE_USE. checker-cadru și eclipse este nulitatea adnotări merge așa; cele mai multe altele nu, și, prin urmare, sunt mai puțin expresive. CheckerFramework merge un pas mai departe și vă permite să scrie noțiunea de 'fie nulitatea este bine'. La fel ca medicamentele generice are 3 forme (List<Integer>
și List<? super Integer>
și List< extends Integer>
odată generice sunt implicate, 2 nullities (fie niciodată nul, sau cu siguranta de nul este permis) nu mai este suficient, ai nevoie de mai mult nullities. checker-cadru a @PolyNull
va vă permite să link-ul de nullities: de exemplu, puteți scrie această metodă în checkerframework dar nu poti scrie corect scris cu intellij, sau pentru care contează eclipse:
public void duplicateFirstMatch(List<T> elems, Predicate<T> matcher);
în cazul în care ideea este: Această metodă conduce meciuri împotriva fiecărui element în listă, și, la un meci, în care elementul este adăugat la sfârșitul listei. Această metodă poate funcționa dacă T
este considerat '@NonNull' (având în vedere că nu valori nule sunt în, null nu poate fi adăugat prin acest cod, astfel încât non-nulitatea dintre elementele sale nu pot fi încălcate de către acesta), dar funcționează la fel de bine dacă T
este @Nullable
, cu condiția matcher este, de asemenea, de @Nullable T
desigur: Acum acest cod s-ar putea adăuga nul pe lista dar asta e bine.
Astfel T
nu este nici Null nici NonNull, dar Ts menționat în semnătura nevoie pentru a se potrivi lor nullities. @PolyNull
rezolvă această problemă.