2012-08-02 49 views
20

我的問題是this one的後續行動。默認情況下如何指示成員字段爲@Nonnull?

在FindBugs的過去的版本中,可以使用@DefaultAnnotation(Nonnull.class)@DefaultAnnotationForFields(Nonnull.class)表明,所有領域在包裝應@Nonnull處理。在當前版本的FindBugs(2.0)中,@DefaultAnnotation@DefaultAnnotationForFields已被棄用,我們應該全部使用JSR-305。但JSR-305似乎無法覆蓋FindBugs註釋所包含的所有內容。

javadoc確實表明了一些備選方案:

  • @ParametersAreNonnullByDefault。這(顯然)只適用於參數,而不適用於成員字段。
  • @CheckReturnValue,當應用於類型或包。同樣,這不適用於成員字段。
  • @TypeQualifierDefault。也許這可以做我想做的,但我不明白它是如何工作的,除了一些神祕的javadoc之外,我無法找到任何有關其用法或意圖的文檔或示例。我認爲它會幫助我創建自己的註釋,但是我能確定所有的工具(FindBugs,Eclipse等)都能正確解釋這個新的註釋(或者甚至可以)嗎?

javadoc沒有提供關於如何處理其棄用的任何提示。

因此,使用當前版本的FindBugs和/或JSR-305,我應該如何指示某個包中的所有成員字段(或者甚至某個類)都應該被視爲@Nonnull?它甚至有可能嗎?

回答

18

我也有類似的問題,發現下面似乎有FindBugs的(2.0.1-RC2)

創建具有以下注釋定義的Java文件的工作

@Nonnull 
@TypeQualifierDefault(ElementType.FIELD) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface FieldsAreNonNullByDefault 
{ 
} 

同樣的,強制所有來自某個方法的返回值都是非空的

@Nonnull 
@TypeQualifierDefault(ElementType.METHOD) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface ReturnTypesAreNonNullByDefault 
{ 
} 

然後將包註釋爲正常。

我用以下爲我的測試(package-info.java)

@javax.annotation.ParametersAreNonnullByDefault 
@com.habit.lib.lang.FieldsAreNonNullByDefault 
@com.habit.lib.lang.ReturnTypesAreNonNullByDefault 

package com.mypackagename.subpkg; 
+5

啊,所以訣竅是定義自己的註釋。我想這是更多的可擴展性,但我不明白爲什麼他們不能像對待ParametersAreNonnullByDefault一樣爲這種情況製作標準註釋。 – jqno 2012-08-06 07:31:50

+8

請注意,您在自定義註釋中爲'Nonnull'使用了不同的大寫字母,而不是JSR-305中可能引起混淆的大寫字母。 – 2012-09-20 21:03:21