前言
在工作中我們經常需要將功能模塊封裝成庫供合作廠商調用, 如何寫好一個健壯的Android Library有很多講究,使用注解可以對SDK暴露給開發者的接口做出一些限制,從而盡可能地避免開發者錯誤地使用API。 下面我們介紹幾種封裝SDK時常用到的注解,需要的朋友們可以參考學習。
一、IntDef與StringDef
我們有時候會使用int常量或者String常量來代替枚舉, 特別在你編寫SDK的時候,你可以通過IntDef或者StringDef來限制接口可接受的參數。
比如,有一個 disableChannel的接口,用來關閉指定的channel 。 我們可以先定義自己的注解@RequirePayChannel
public static final int CHANNEL_UNIONPAY = 0x11000;public static final int CHANNEL_ALIPAY = 0x12000;public static final int CHANNEL_WECHAT = 0x13000;@Retention(RetentionPolicy.SOURCE)@IntDef({CHANNEL_UNIONPAY,CHANNEL_ALIPAY,CHANNEL_WECHAT})public @interface RequirePayChannel {} 這樣,你便可以通過@RequirePayChannel來指定disableChannel()的可接受參數
public void enableChannel(@RequirePayChannel int channel) { // do something}這樣,一些IDE還會自動提供給你建議參數。如果填入指點范圍之外的參數,將會出現錯誤提示并無法編譯通過。

值得一說的是, 在這里,我們使用到了@Retention(RetentionPolicy.SOURCE) 。 它指定了編譯器在處理Animation時候的處理方法。 默認編譯器會將常量替換成對應的數值,如果沒指定該注解,你編譯完成后將得到這樣的class文件:

這樣會導致IDE不能提示到有意義的信息。并且一定要指定為特定的int數值,否則也無法編譯通過。

所以,應該指定Retention讓編譯器不對該注解做額外的優化處理。
二、DrawableRes, StringRes 與 DimenRes
當我們在編寫指定資源文件的接口時,可以通過資源注解來指定該方法接受的資源類型。 指定錯誤的資源將不能編譯通過。 下面代碼中,我們使用@DrawableRes來表明setLogo方法只支持Drawable資源的ID。
public void setLogo(@DrawableRes int resurceId) { // do something}當我們提供錯誤的資源,IDE將會報錯。

@StringRes 與 @DimenRes 的使用方法也類似。
三、NonNull 與 Nullable
將一個空值傳入一個方法中可能引發潛在的Crash。 我們應該極力避免這種情況, @NonNull 可以指定參數是否接受空值,當我們傳入一個空值的時候,IDE會給出響應的警告。 我們可以這樣使用它:
public void setContext(@NonNull Context context) { // do something}當我們對其傳入一個空值的時候,將會顯示警告(但代碼仍然能通過編譯)

@Nullable 用于修飾參數或者方法的返回值可能為空,提醒開發者主要空值檢查。
@Nullablepublic Context getContext() {return null;} 
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持。
新聞熱點
疑難解答