2011-12-05 49 views
7

我發現不方便checkNotNull()番石榴的前提條件是沒有標註@Nonull註解。考慮下面的例子:爲什麼checkNotNull()不用@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(); 
} 

所以IDE找不到variations == null總是錯誤的。有沒有什麼特別的原因,爲什麼這個先決條件沒有標記@Nonull(即使它的參數是用@Nullable定義的)。

+1

我可能會錯過爲GitHub wiki頁面發送PR的選項,因爲我會寫一些擴展自己的東西。但是因爲我不能,有人可以添加至少一個句子,如「番石榴只在內部使用@Nullable,所以所有返回類型都是假的,但沒有用@Nonull標記」(或類似):https://github.com/google/ guice/wiki/UseNullable – eckes

回答

9

We haven't used @Nonnull anywhere,對不起。爲什麼?我們嘗試添加更多空值檢查註釋,並且我們發現:

  • 添加所有其他註釋非常冗長。
  • @Nullable是我們所需要的全部NullPointerTester。無可否認,這對Guava開發者來說比Guava用戶更重要。
  • @Nullable似乎已經發現了大部分問題。我承認很難說在用戶找到它們之前其他註釋會捕獲多少個未簽入的錯誤。

冗長是主要的東西。它變得瘋狂,特別是使用子類型和參數化類型。我們試圖爲註釋選擇一個甜蜜點。也許我們有一天會改變它。不過,現在,這就是爲什麼事情是這樣的。

(如果我們確實做了某些事情,我懷疑我們會設法使@Nonnull成爲默認設置,而使用@CheckForNull作爲例外,但我沒有仔細研究它,以確保我的意思是正確的)

+5

一些工具可能足夠聰明,可以注意到package-info使用@ParametersAreNonnullByDefault註釋。 –

+4

與此問題相關,我認爲我們也需要@ReturnsAreNonnullByDefault,對不對?我不知道這是否存在。 –

+0

對於參數,字段和方法(返回值),我們已經將所有軟件包默認設置爲非null。對於後兩者,我必須從FindBugs複製棄用的註釋。到目前爲止,我對這個結果非常滿意。在稍後我肯定會咬我的舉動中,我將'@ CheckForNull'複製到一個專用的'@ Nullable'中,並禁止使用原始文件,因爲後者的名字與用意相符得多,輸入更容易,並且更易讀。 –

7

這的確將是有趣的註釋其結果與@Nonnull,因爲checkNotNull()拋出一個NPE如果參考是null,這意味着它永遠不會返回null

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

請注意,你需要改變你的代碼:

if(this.variations == null) 

因爲@Nonnull只適用於checkNotNull()的結果,但沒有關於它的爭論說。請注意,我們不能用@Nonnull註釋參數,因爲我們通常會檢查可爲空的變量。

相關問題