2015-07-01 16 views
6

Sözleşme imzalarını açıklığa kavuşturmak için işlev imzalarıma açıklamalı olarak eklemek isterim - özellikle de, null params ve dönüş değerlerine izin veriliyorsa veya yasaklanmışsa - FindBugs gibi Statik kod analiz aracı (ve belki diğer) bunu kullanabilir.FindBugs '@CheckForNull, @Nonnull ve @Nullable ek açıklamalarını nasıl kullanırım?

Bunu başarmak için dört açıklamanın yanı sıra bir açıklama eklememe seçeneğinin yanı sıra iki paket (annotations.jar ve jsr305.jar) vardır.

+1

Bu, '@ Nonnull',' @ NotNull' değil – fge

+0

olacaktır. Teşekkürler. – Paramaeleon

cevap

6

Bunlar benim bulgular, bazı etrafında denedikten sonra şunlardır:

Yöntem parametreleri:

  • Parametre null olmamalıdır: Herhangi ek açıklama koymayın. Bu durumda, yönteme null iletilirse bir hata işareti görüntülenir. (@Nonnull ek açıklama koyarak zaman bu davranışı beklediğinden, ama bunu koyduğunuzda, hiçbir hata işaretleyici hiç gündeme geldi.)
  • Parametre null olabilir: @Nullable ek açıklama koyun. . @CheckForNull için (Aynı etki @Nullabledocumentation okur: “Onlar hiçbir ek açıklama vardı sanki FindBugs açıklamalı öğeleri ele alacağız.” Bu doğru değil ben string.length() arayıp String string@Nullable olarak işaretlenmişse, görünmesini bir hata işaretini neden olur. hiçbir açıklama varsa, hiçbir hata işaretleyici gösterdi)

Yöntem dönüş değeri:.

  • Yöntem return null asla vermez: @Nonnull koyun. Yöntemin içinden return null;'u denerseniz bir hata işaretçisine neden olur.
  • Yöntem olabilir return null: Bunun için denetimleri zorlamak ister misiniz? Geri dönüş değeri, yalnızca arama parametresinde bilindiği varsayılan yöntem parametrelerine bağlıysa, “benim yöntemim, negatif olan parametre null değerini döndürür” gibi bir ek yük olabilir. Bu durumda bir açıklama koymam. Ancak, null'u döndürmek yerine IllegalArgumentException atmayı düşünebilirsiniz.
  • Yöntem null yöntemini döndürebilir ve dönüş nesnesi her zaman kontrol edilmelidir: Koy @CheckForNull. Ancak, birçok durumda, gitmek için daha iyi yollar vardır, null listeleri yerine Collections.emptyList() döndürme veya MissingResourceException, IOException veya başka bir uygun özel durum atmayı düşünebilirsiniz. kullanmak JAR dosyası

:

  • Hem kavanoz dosyaları FindBugs aynı davranışa neden, tek fark Eclipse kullanımdan kaldırılmış olarak annotations.jar gelen açıklamalar gösteriyor olmasıdır. Yani jsr305.jar kullanın.
  • Kavanoz dosyası gerekli. Verilen paket ve sınıf adıyla boş ek açıklamalar oluşturmak işe yaramıyor. get it here.
3

@Paramaeleon böyle sen @Nonnull yazarsanız FindBugs unintuitively tüm uyarıları bastırır çünkü Açıklama içermeyen bir yöntem parametresi terk etmelidir nasıl gibi bazı harika ipuçları verdi.

Farklı bir statik analiz aracını denemek istiyorsanız, Checker Framework'un Nullness Checker'unu düşünebilirsiniz.

Ana fark, Boşluk Denetleyicisi'nin tüm boş gösterici hatalarını algılamasıdır. Buna karşılık, FindBugs daha az yanlış pozitif uyarı bildirmek için bilerek olası bazı hataları bildirmez. Her iki araç da yazdığınız ek açıklamaları daha iyi sonuç verir. Herhangi bir açıklama yazmak istemiyorsanız, FindBugs daha uygun bir araçtır. Ek açıklama yazmak istiyorsanız, Checker Framework daha iyi olabilir.

Boşluk Denetleyicisi kılavuzunda, choosing a nullness analysis tool ile ilgili bölümde daha fazla karşılaştırma bulunmaktadır.

İlgili konular