De ce nu @NotNull sau @Null există în proiectul meu?

0

Problema

Am programare cu IntelliJ, și am fost de lucru pe un proiect Java, și am vrut să fac un parametru adnotat ca @NotNull. Dar IntelliJ spune că nu există. Am verificat toate fișierele java și nu este în proiectul meu. Eu sunt atât de confuz, și eu nu sunt, folosind maven sau gradle, doar implicit proiect Java. Nu am nici o idee ce se întâmplă.

Aici este un exemplu:

package com.company;


    public class Main {
         public static void main(String[] args){
                testF(null);
         }
         public static void testF (@NotNull Integer... numbers){
            for(Integer integer: numbers){
                   System.out.println(integer);
          }
     }
}

O eroare vine în a spune "nu Pot rezolva simbol NotNul : 10" (din nou @ in fata)

annotations intellij-idea java
2021-11-22 22:38:50
1

Cel mai bun răspuns

0

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ă.

2021-11-22 22:56:48

În alte limbi

Această pagină este în alte limbi

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................