2015-08-15 31 views
7

我對這些註釋的正確使用感到困惑。@NonNull和@Nullable的正確用法是什麼?

android.support.annotation.NonNull; 
android.support.annotation.Nullable; 

@NonNull文檔中的信息說:

表示一個參數,字段或方法的返回值不能爲空。

這是什麼意思在參數的情況下,當沒有什麼可以阻止你通過null

例如,假設我有一個類MyObject和一個實例可以或可以不具有一個標題。

public final class MyObject { 

    private String title = null; 

    public void setTitle(String title) { 
     if (title == null) 
      throw new NullPointerException(); 
     this.title = title; 
    } 

    public void clearTitle() { 
     title = null; 
    } 
} 

這裏我使用null表示沒有標題的,但是這是一個實現細節,所以我不想對設置和清除標題一個方法。

如果我標誌着該領域title@Nullable,機器人工作室告訴我,參數setTitle也許應該被標記@Nullable太(但這是我想的正好相反)。

如果我標誌着參數爲setTitle方法@NonNull我得到的警告條件title == null總是false

在這種情況下,這些註釋的正確用法是什麼?如果@NonNull意味着一個參數可以永遠null是錯用它來指應該null?如果是,是否有正確的方法來表明這一點?

回答

1

的一點是,這個註釋是某種形式的合同,所以你並不需要,如果你正確地annoate你的方法進行檢查。 Android Studio會檢查你是否不喜歡它。您仍然可以忽略它,但這會導致編譯器警告。

如果省略無用的(合同)的安全檢查,將正確拋出NullPointerException異常。但是開發者被你的註解警告了。

+0

一般來說,檢查仍然是必需的。註釋有助於IDE瞭解合同。一些IDE進一步發展併產生運行時錯誤,雖然IDE的這種運行時檢查是禮節性的,而不是要求。 –

0

@Nonnull@Nullable是聲明。這是同行軟件開發人員的一個暗示。你告訴他們,一個參數可以是一個空值,或者它不能。

如果標記與@Nonnull標註的參數,你告訴使用API​​的每個人,他們不應該在這裏傳遞null值,否則他們不得不面對的後果(例如NullPointerException)。

你可以用它來聲明,該參數不應爲空,這是一個有效的使用情況,在我看來。

0

來吧,標誌着參數爲setTitle方法@NonNull

當某些代碼調用setTitle的值爲可能爲空時,這將確保編譯器發出錯誤。所以編譯器確保setTitle從來沒有null調用。因此,您可以刪除方法中的null檢查,使'title == null始終爲false'警告消失。

I.e.你的代碼看起來就像這樣:

public final class MyObject { 

    private String title = null; 

    public void setTitle(@NonNull String title) { 
     this.title = title; 
    } 

    public void clearTitle() { 
     title = null; 
    } 
} 

(注:我沒有使用過Android Studio,但我想它的行爲類似於Eclipse在Eclipse中我得到一個錯誤Null type mismatch: required '@NonNull String' but the provided value is null(/inferred as @Nullable)試圖通過空或表達式可以爲空時。到的setTitle)

BTW:還標註場title的定義與@Nullable將使它更加明確title也可以包含null值。

0

如果您將參數標記爲@NonNull,那麼您的方法的用戶需要執行空檢查,因爲@NonNull在運行時不會捕獲NPE。因此,舉例來說,如果您有一個帶有幫助器方法的實用程序類,它在執行之前檢查null,那麼您會將這些參數標記爲@Nullable,因爲您在技術上可以傳遞空值,但是正在安全地檢查它。

相關問題