Dlaczego w moim projekcie nie ma @NotNull lub @Nullable?

0

Pytanie

Ja programuje za pomocą IntelliJ, a ja po prostu pracował nad projektem Java, i chciałem zrobić parametr аннотированным jak @NotNull. Ale IntelliJ mówi, że go nie ma. Sprawdziłem wszystkie pliki java, i nie ma ich w moim projekcie. Byłem tak zdezorientowany, a ja nie używam maven lub gradle, po prostu projekt Java domyślnie. Nie mam pojęcia, co się dzieje.

Oto przykład:

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);
          }
     }
}

Pojawia się błąd ze słowami "Nie można rozpoznać symbol NotNul : 10" (ponownie @ przodu)

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

Najlepsza odpowiedź

0

Sama Java nie jest z tymi adnotacjami.

Zamiast tego istnieje około 10 wzajemnie wykluczających się podejść do tego pomysłu, z których większość pracuje zupełnie inaczej i stosuje różne znaczenia do tego, co NonNull znaczy, gdzie można go umieścić i jak to działa.

Bogactwo. To bardzo smutne, ponieważ główną ideą korzystania z adnotacji na dodanie tej informacji znacznie przewyższa niepotrzebną i tym podobne, biorąc pod uwagę, że będzie ona w pełni kompatybilny i nie doprowadzi istniejący kod do depresji wieku, w przeciwieństwie do Optional.

Tak więc, znajdź ten, który ci się podoba, włącz je w swój projekt tak samo, jak włączeniu jakiejkolwiek zewnętrznej zależność - zazwyczaj poprzez włączenie go w swój Maven/Gradle/Ant+ivy/etc (lista zależności twój plik kompilacji).

U Intellij ma swój własny pogląd na zera i обнуляемое. To chyba najbardziej wygodna. Jego wyobrażenia o tym, co oznaczają te adnotacje, poniżej 1. Ramy Checker jest najlepszy, eclipse zajmuje drugie miejsce, a cała reszta (w tym intellij) zajmuje trzecie miejsce. najlepsze rozwiązanie można znaleźć w ramach kontroli, lub prawie tak samo dobrze, w eclipse, w tych komentarzach. Wątpię jednak, że systemy kontroli zer intellij są w stanie w pełni go zrozumieć bardziej zaawansowane dodatki, takie jak @PolyNullwięc ta informacja wyraziste moc będzie głównie przeznaczona zmarnowane. Jako bonus intellij usług mnóstwo danych o tym, jakie powinny być odpowiednie adnotacje o nieważności w głównych bibliotekach.

Ostatnia ważne: najczęściej używane biblioteki java, w tym java.* sam w sobie, nie ma tych komentarzy, i praca z kodem z pół zerowym adnotacjami, na pewno jest bardzo nieprzyjemnym zajęciem; koszty znacznie przewyższają korzyści. Jedyne realne rozwiązanie - "naprawić" biblioteki, które używasz, z prawidłowej informacji o nieważności, ale to jest ogromna praca. Na szczęście, intellij wiele zrobił dla ciebie.

Spodziewałem się (eclipse to robi), że szybkie poprawka (CMD+1 na komputerach mac, CTRL+1 na komputerach, które nie są komputerami Mac, przynajmniej z pudełka, jeśli mi pomaga pamięć o skrótach klawiaturowych domyślnie) obejmuje "automatyczne dodawanie adnotacji o nieważności eclipse w drogę do klasy" (lub, w danym przypadku, intellij, oczywiście). Jeśli to dlaczego nie jest widoczny, ale ta strona z dokumentów intellij dokładnie wyjaśnia, jak dodać org.jetbrains.annotations biblioteka, zawierająca ich adnotacje o nieważności, dla swojego projektu. W rzeczywistości, te dokumenty wskazują na to, że menu quickfix naprawdę oferuje możliwość automatycznego dodawania tej biblioteki jako rozwiązanie błąd, który masz na swoim @NonNull węzeł w kodzie źródłowym.

[1] Większość komentarzy z zerową wartością znacznie ograniczają się, pozwalając adnotację tylko dla pól, metod (co oznacza: że ona zwraca) i parametrów. Można jednak mieć na pewno nie zero List z może być-zero Map egzemplarze, które na pewno nie są pustymi String to może być zero Integer: @NonNull List<@Nullable Map<@NonNull String, @Nullable Integer>>. System komentarzy jest w stanie pozwolić ci to napisać, ale tylko w przypadku, jeśli twoje adnotacje dostosowane wyłącznie do TYPE_USE. Adnotacje frameworka checker i eclipse nullity działają w podobny sposób; większość innych nie działają i dlatego są mniej wyraziste. CheckerFramework robi jeszcze jeden krok do przodu i pozwala ci napisać pojęcie "albo nieważność-to jest w porządku". Tak samo, jak generyczne są 3 formy (List<Integer>i List<? super Integer> i List< extends Integer>jak tylko zaangażowane uniwersalne, 2 wartości null (lub nigdy nie jest równa zero, albo na pewno jest dozwolone wartość null) już za mało, trzeba więcej wartości null. struktura kontroli ma @PolyNull wola pozwala ci komunikować pustki: można, na przykład, napisać ten metoda w checkerframework, ale nie można napisać go poprawnie z pomocą intellij lub, jeśli o to chodzi, eclipse:

public void duplicateFirstMatch(List<T> elems, Predicate<T> matcher);

gdzie pomysł: metoda Ta uruchamia program rozpoznawania nazw dla każdego elementu na liście, i gdy przypadkiem ten element jest dodawany na końcu listy. Ta metoda może zadziałać, jeśli T jest uważany za "@NonNull " (biorąc pod uwagę, że w kodzie nie ma zer, null nigdy nie może być dodana tym kodem, więc nie może naruszać wartość niezerową jego elementów), ale działa tak samo dobrze, jeśli T jest @Nullablepod warunkiem, że odebrano również ma @Nullable T oczywiście: teraz ten kod może dodać null do listy, ale to jest w porządku.

W ten sposób T nie jest ani nieważności, ani zera, ale Ts, o których mowa w podpisie, muszą być zgodne z ich nieważności. @PolyNull rozwiązuje ten problem.

2021-11-22 22:56:48

W innych językach

Ta strona jest w innych językach

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