Projemde neden @NotNull veya @Nullable yok?

0

Soru

IntelliJ ile programlama yapıyorum ve sadece bir Java projesi üzerinde çalışıyordum ve şu şekilde açıklamalı bir parametre yapmak istedim @NotNull. Ama IntelliJ öyle bir şey olmadığını söylüyor. Tüm java dosyalarını kontrol ettim ve projemde yok. Kafam çok karıştı ve maven veya gradle kullanmıyorum, sadece varsayılan Java projesi. Neler oluyor hiçbir fikrim yok.

İşte bir örnek:

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

"NotNul : 10 sembolü çözülemiyor" diyerek bir hata geliyor (yine @ önünde)

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

En iyi cevabı

0

Java'nın kendisi bu ek açıklamalarla birlikte gönderilmez.

Bunun yerine, çoğu tamamen farklı çalışan ve neye farklı anlamlar uygulayan, karşılıklı olarak uyumsuz yaklaşık 10 fikir vardır NonNull nereye koyabileceğiniz ve nasıl çalıştığı anlamına gelir.

Pöf. Bu bilgiyi eklemek için ek açıklamalar kullanmanın temel fikri, tamamen geriye dönük olarak uyumlu olacağı ve mevcut kodu eskime sıkıntılarına düşürmeyeceği göz önüne alındığında, İsteğe Bağlı ve benzerlerinden çok daha üstün olduğu için bu çok talihsiz bir durumdur. Optional.

Bu nedenle, beğendiğiniz birini bulun ve projenize herhangi bir üçüncü taraf bağımlılığını dahil ettiğiniz gibi ekleyin - genellikle Maven/Gradle/Ant+ıvy/etc (yapı dosyanızın bağımlılık listesi).

Intellij'in NonNull ve Nullable üzerine kendi görüşü vardır. Muhtemelen en uygun olanıdır. Onun fikirleri hakkında ne bu notlar kötü aşağı1. Denetleyici Çerçevesi en iyisidir, eclipse uzak bir ikinci en iyisidir ve diğer her şey (ıntellij'ler dahil) üçüncü sırayı paylaşır. en iyi sonuç, Checker Çerçevesinde ya da neredeyse eclipse'in bu ek açıklamaları ele almasıdır. Bununla birlikte, ıntellij'in null kontrol sistemlerinin, aşağıdaki gibi daha gelişmiş eklemelerini tam olarak anlayabileceğinden şüpheliyim @PolyNull bu nedenle, bu ek ifade gücü çoğunlukla boşa harcanacaktır. Bir bonus olarak, ıntellij, büyük kütüphanelerde doğru boşluk ek açıklamalarının ne olacağı hakkında bir sürü veriyle birlikte gelir.

Sonuncusu önemlidir: Aşağıdakiler de dahil olmak üzere en sık kullanılan java kütüphaneleri java.* kendisi, bu ek açıklamalara sahip değildir ve yarı boş açıklamalı kodla çalışmak kesinlikle son derece sinir bozucu bir alıştırmadır; Bunu yapmanın maliyetleri faydalardan çok daha ağır basar. Tek gerçek çözüm, kullandığınız kütüphaneleri doğru boş bilgi ile 'düzeltmek', ancak bu bir ton iştir. Neyse ki ıntellij senin için çok şey yaptı.

(Eclipse bunu yapar), quickfix'in (mac'lerde CMD+1, mac olmayanlarda CTRL+1, en azından varsayılan klavye kısayollarının hafızam bana hizmet ederse kutunun dışında) 'eclipse'in boşluk ek açıklamalarını sınıf yoluna otomatik olarak ekle' (veya sizin durumunuzda ıntellij'ler, elbette). Bu bir şekilde görünmüyorsa, ıntellij dokümanlarındaki bu sayfa tam olarak nasıl ekleneceğini açıklar. org.jetbrains.annotations projenize geçersiz ek açıklamaları içeren kitaplık. Aslında, bu dokümanlar, quickfix menüsünün size bu kütüphaneyi otomatik olarak kendi başınıza aldığınız hataya çözüm olarak ekleme seçeneği sunduğunu gösterir. @NonNull kaynak kodunuzdaki düğüm.

[1] Boşluğa ilişkin ek açıklamaların çoğu, ek açıklamaya yalnızca alanlara, yöntemlere (ne döndürdüğünü ima ederek) ve parametrelere izin vererek kendilerini önemli ölçüde sınırlar. Ancak, kesinlikle değil, bir-null List null olabilir Map kesinlikle null olmayan Eşleyen örnekler String null olabilir Integer: @NonNull List<@Nullable Map<@NonNull String, @Nullable Integer>>. Ek açıklama sistemi bunu yazmanıza izin verebilir, ancak yalnızca ek açıklamalarınız yalnızca TYPE_USE için ayarlanmışsa. checker framework'ün ve eclipse'in nullity ek açıklamaları bu şekilde çalışır; diğerlerinin çoğu bunu yapmaz ve bu nedenle daha az etkileyicidir. CheckerFramework bir adım daha ileri gider ve 'her iki boşluk da iyidir'kavramını yazmanıza izin verir. Tıpkı jeneriklerin 3 formu olduğu gibi (List<Integer>, ve List<? super Integer> ve List< extends Integer>.jenerikler söz konusu olduğunda, 2 boşluğa (asla boş veya kesinlikle boşluğa izin verilmez) artık yeterli değildir, daha fazla boşluğa ihtiyacınız vardır. denetleyici çerçevesi vardır @PolyNull olacak nullities bağlantı sağlar: örneğin ama muhtemelen düzgün Eclipse ile, ya da bu konuda tutulma için yazılmış bunu yazamaz checkerframework bu yöntem yazabilirsiniz :

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

buradaki fikir şudur: Bu yöntem eşleştiriciyi listedeki her öğeye karşı çalıştırır ve bir eşleşme üzerine bu öğe listenin sonuna eklenir. Bu yöntem aşağıdaki durumlarda işe yarayabilir T '@NonNull ' olarak kabul edilir (boş değerlere sahip olmadığı göz önüne alındığında, null bu kod tarafından hiçbir zaman eklenemez, bu nedenle öğelerinin boş olmaması onun tarafından ihlal edilemez), ancak şu durumlarda da çalışır T oluyor @Nullable, eşleştiricinin de olması şartıyla @Nullable T tabii ki: Şimdi bu kod listeye null ekleyebilir, ancak sorun değil.

Böylelikle T Nullable veya NonNull değildir, ancak imzada belirtilen Ts'nin boşluklarını eşleştirmesi gerekir. @PolyNull bu sorunu çözer.

2021-11-22 22:56:48

Diğer dillerde

Bu sayfa diğer dillerde

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