2

我不清楚我們如何正確使用關於可爲空的註釋,即NonNull和Nullable。
我不喜歡的東西下面真的很舒服:理解非空和空性註釋

public void foo(@NonNull ArrayList<CustomObject> list) { 
    CustomObject o = list.get(0); //etc 
} 

1)它是無感申報非空代碼防守?
2)什麼是使用這種註釋最有效的方法?例如。作爲示例
- 在使用構建器模式時應該如何使用它們或者
- 何時定義要實現的具體類的接口?實現類的方法是否應該包含註釋還是假設?
3)在上面的代碼片段中,有沒有一種方法可以定義非空的非空?

+0

我通常用'@ NonNull'當我知道一個變量是保證不爲空。據我所知,它對編譯代碼沒有任何影響,但是在IDE中禁止了所有「可能爲null」的警告。相反,我使用'@ Nullable',在那裏有*我希望*變量爲null的場合。 –

+0

@MichaelDodd:在審查你的代碼時,這不是爲了你自己的自我記錄目的嗎?關於* other * devs將使用/訪問的方法怎麼樣一種實用方法或方法是否意味着成爲模塊或庫的一部分? – Jim

+0

我想文檔和可讀性是'android-annotations'的全部目的。在我工作的團隊中,我們廣泛使用這些註釋來澄清變量可能/不應該爲null。同樣,如果庫方法a是這樣註釋的,它會變成關於是否需要「空」檢查的建議。 –

回答

0

現在我已經有適當的時間進行調查了,這是我發現的。

1)

它可以完美的防守依然代碼,而使用@NonNull註解。僅僅因爲參數有@NonNull註釋,null仍然可以在運行時傳遞。例如,數據類,如:

class DataClass { 
    @NonNull private String notNullString; 

    public DataClass() { notNullString = null; } 

    public String toString() { return notNullString; } 
} 

,你要指定null@NonNull變量,但調用toString()回報nullIDE will warn。爲了解決這個問題,以及要求why you're null-checking a @NonNull variable的IDE警告,Google傾向於使用PreConditions.checkNotNull(T) - 請參閱example code

2)

正如在評論中提到的,我個人使用註解指導,null是否是一個預期值與否。我無法找到在構建器模式中使用的任何實例,但可能可以在build()方法中使用checkNotNull()來強制執行此操作,以便任何意外的null值都會引發NullPointerException

至於具體的課程,取決於你,但我個人會爲了一致性而添加它們。

3)

鑑於上述情況,我會做這種方式:

public void foo(@NonNull ArrayList<CustomObject> list) { 
    checkNotNull(list, "List is null!"); 
    if (!list.isEmpty()) { 
     CustomObject o = list.get(0); //etc 
    } 
} 
+0

在我看來,我期待註解的目的是通過減少大量空值檢查來促進設計合同,從而導致稍微更優化(更少ifs)和更簡潔的代碼。如果我們希望無論如何檢查無效,那麼似乎推理過於複雜。我明白它有助於記錄事物,但最終如何看待@NonNull。我有道理嗎? – Jim

+0

是的,這是有道理的。在理想的世界中,應該有一個伴隨的'annotationProcessor',確保標記爲「@ NonNull」的東西永遠不會被賦予'null'。但是,它也需要檢查相同的變量總是分配一個默認值,否則[未初始化的對象](http://stackoverflow.com/questions/16699593/uninitialized-object-vs-object-initialized-to- null)將成爲一個問題。這會引發一系列新問題。 –