2011-12-05 7 views
7

ile açıklanmıyor Neden guavada checkNotNull() önşartının @Nonull ek açıklaması ile işaretlenmemiş olduğunu buldum. Örneğin aşağıdaki düşünün:NedenNotNull(), @Nonnull

State(Set<Model> models, Set<Variation> variations) { 
    this.models = checkNotNull(models); 
    this.variations = checkNotNull(variations); 

    if (this.variations == null) { 
    throw new IllegalArgumentException(); 
    } 
    this.engine = createEngine(); 
} 

Yani IDE variations == null hep yanlış olduğu tespit edemedi. Bu ön koşulun @Nonull ile işaretlenmemesinin (@Nullable kullanarak bağımsız değişkenler tanımlanmış olsa bile) herhangi bir özel nedeni var mı? Referans asla null döndürür, yani null ise

+1

GitHub wiki sayfası için bir PR göndermeyi tercih edebilirim çünkü kendim için bir şey yazabilirdim. Ama yapamayacağımdan, birisi en azından "Guava'nın dahili olarak @Nullable kullanıyor, bu yüzden tüm iade türleri @Nonull ile işaretlenmemiş (veya benzerleri)" (veya benzerleri): https://github.com/google/ guice/wiki/UseNullable – eckes

cevap

9

We haven't used @Nonnull anywhere, üzgünüm. Niye ya? Biz birkaçı boş denetimi ek açıklamalar ekleyerek çalıştı ve biz bulduk: Diğer tüm açıklamaları ekleme son derece ayrıntılı olduğunu

  • .
  • @NullableNullPointerTester için tüm ihtiyacımız olan şeydir. Kuşkusuz bu Guava kullanıcıları için Guava geliştiriciler için daha önemlidir. Çoğu problemle karşılaştığı görülmüştür. Diğer ek açıklamaların kaç tane kontrol edilemeyen hataların, kullanıcı onları bulmadan önce yakalanabileceğini söylemek zor.

Ayrıntı, asıl şeydi. Özellikle subtipleme ve parametreli tiplerle deliriyor. Ek açıklamalar için tatlı bir nokta seçmeye çalıştık. Belki bir gün değiştiririz. Şimdilik, bununla birlikte, işte bu yüzden şeyler onlardır.

(Bir şey yapsaydık, bunun yerine istisnalar için @CheckForNull kullanarak @Nonnull varsayılanı yapmaya çalışacağımızdan şüpheliyim.Ama anlamları anlamış olmamaya yetecek kadar incelemedim. .)

+5

Bazı araçlar, paket bilgilerinin @ParametersAreNonnullByDefault ile açıklandığını fark edecek kadar akıllı olabilir. –

+4

Bu soruyla ilgili olarak, @ReturnsAreNonnullByDefault'a ihtiyacımız olduğunu düşünüyorum, değil mi? Ve bunun var olup olmadığını bilmiyorum. –

+0

Parametreleri, alanları ve yöntemleri (dönüş değerleri) için varsayılan olarak tüm paketleri boş olmayan olarak ayarladık. İkincisi için, kullanımdan kaldırılan ek açıklamaları FindBugs'dan kopyalamak zorunda kaldım. Şimdiye kadarki sonuçtan oldukça memnun kaldım. Daha sonra beni ısırmayacak bir hareketle, '@ CheckForNull' özel bir '@ NULL' olarak kopyaladım ve orijinalin kullanılmasını yasakladım çünkü bu ad daha iyi niyetle eşleşiyor, yazması daha kolay ve daha okunabilir oluyor . –

7

Gerçekten checkNotNull() beri @Nonnull ile sonuca açıklama ilginç olurdu bir NPE atar: Değiştirmek gerekiyordu

@Nonnull 
    public static <T> T checkNotNull(T reference) { 
    if (reference == null) { 
     throw new NullPointerException(); 
    } 
    return reference; 
    } 

Not senin kod: @Nonnull beri

if(this.variations == null) 

sadece checkNotNull() sonucuna geçerlidir, ancak onun argümanı hakkında hiçbir şey söylemez olur. Yinelenebilen değişkenleri sık sık kontrol edebildiğimiz için argümanı @Nonnull ile ekleyemediğimizi unutmayın.

İlgili konular