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.