使用Android Support Annotations優化代碼


原文鏈接:http://michaelevans.org/blog/2015/07/14/improving-your-code-with-android-support-annotations/

本文有翻譯+個人使用心得。

如果你還沒有聽說過Android Support Annotations 函數庫,你將錯過一個整潔的新軟件包,它有助於你捕獲程序中的bugs。該函數庫包含了許多的Java註解,用於幫助Android Studio檢測代碼中可能存在的錯誤,並報告給開發者。註解類型有很多種,本文將只介紹其中幾種,請一定要自己閱讀文檔以瞭解本文未介紹的其他註解類型。


@NONNULL / @NULLABLE

@NonNull和@Nullable可能是support annotations最基礎的也是最有用的註解之一了。使用這兩個註解修飾的函數參數或者函數,表示參數或者函數返回值是否可以爲空,之後 Android Studio在代碼可能出現不安全的情況下會給出智能提示。

使用註解前後對比如下:

未使用註解:



使用@NonNull註解:




官方解釋:


在移除警告之後, when the program runs 到底是個什麼意思,是運行無異常,還是說在會觸發空指針的地方沒問題。不解到底是for static analysis還是for runtime.而且明明as是不會給warning的,只是一個小提示而已。


所以做了個試驗如下:




有提醒,!null是恆成立的,也就是說是個runtime咯?於是不加判斷,直接傳入null,然後程序崩潰。

於是看看這個註解怎麼寫的:



從而得知,@NonNull這個註解應該不是for runtime,但是這個註解有問題,基本沒作用。

@CheckResult


更進一步,我們可以使用@CheckResult註解來讓使用者知道該函數的返回值是需要使用的,沒有使用函數的返回值則Android Studio會給出警告提示




@STRINGRES / @DRAWABLERES等

你是否遇到過嘗試調用TextView的setText函數,結果出現如下異常:

android.content.res.Resources$NotFoundException: String resource ID #0x3039


當你給setText函數傳入一個整型值,TextView將它作爲一個String資源id對待,並會進行查找以便設置這個字符串。如果存在一個可以標識整型值是非法ids的註解就好了,@StringRes正是用來實現這個功能的!


public void setText(@StringRes int id) {
 
  // Do something like getString(id), etc.
 
}

現在如果你試圖傳遞一個非字符串的資源id給這個函數,你將得到如下提示:




@KEEP

最近我發現一個新的support annotation註解@Keep。根據support annotations文檔說明,這個註解還沒有被關聯到Gradle插件中,被這個註解修飾的函數或者類,在代碼混淆進行壓縮時會被保持住。

如果你曾經在使用Proguard時使用過

-keep class com.foo.bar { public static <methods> }


你會知道當嘗試把某個特定的函數或者類從優化操作中排除掉是多麼痛苦的事情。使用這個註解將會告訴Proguard不要對指定的函數或者類進行優化操作:


public class Example {
 
  @Keep
 
  public void doSomething() {
 
      // hopefully this method does something
 
  }
 
  ...
 
}


好消息是,如果你已經使用了appcompat-v7,那麼support-annotations已經被包含在裏面了,可以立刻開始使用它了。



發佈了39 篇原創文章 · 獲贊 30 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章