Android中封裝SDK時常用的注解總結(jié)
前言
在工作中我們經(jīng)常需要將功能模塊封裝成庫供合作廠商調(diào)用, 如何寫好一個健壯的Android Library有很多講究,使用注解可以對SDK暴露給開發(fā)者的接口做出一些限制,從而盡可能地避免開發(fā)者錯誤地使用API。 下面我們介紹幾種封裝SDK時常用到的注解,需要的朋友們可以參考學(xué)習(xí)。
一、IntDef與StringDef
我們有時候會使用int常量或者String常量來代替枚舉, 特別在你編寫SDK的時候,你可以通過IntDef或者StringDef來限制接口可接受的參數(shù)。
比如,有一個 disableChannel的接口,用來關(guān)閉指定的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()的可接受參數(shù)
public void enableChannel(@RequirePayChannel int channel) {
// do something
}
這樣,一些IDE還會自動提供給你建議參數(shù)。如果填入指點范圍之外的參數(shù),將會出現(xiàn)錯誤提示并無法編譯通過。

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

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

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

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

@Nullable 用于修飾參數(shù)或者方法的返回值可能為空,提醒開發(fā)者主要空值檢查。
@Nullable
public Context getContext() {return null;}

總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
ViewPager+PagerAdapter實現(xiàn)帶指示器的引導(dǎo)頁
這篇文章主要為大家詳細(xì)介紹了ViewPager+PagerAdapter實現(xiàn)帶指示器的引導(dǎo)頁,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-09-09
初學(xué)Android之網(wǎng)絡(luò)封裝實例
大家好,本篇文章主要講的是初學(xué)Android之網(wǎng)絡(luò)封裝實例,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽2021-12-12
Android對圖片Drawable實現(xiàn)變色示例代碼
這篇文章主要給大家介紹了關(guān)于Android對圖片Drawable實現(xiàn)變色的相關(guān)資料,文中通過示例代碼將實現(xiàn)的方法介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧。2017-08-08
Android 開發(fā)之旅:詳解view的幾種布局方式及實踐
這篇文章主要介紹了Android 開發(fā)之旅:詳解view的幾種布局方式及實踐,具有一定的參考價值,有需要的可以了解一下。2016-12-12
Android編程實現(xiàn)可滑動的開關(guān)效果(附demo源碼下載)
這篇文章主要介紹了Android編程實現(xiàn)可滑動的開關(guān)效果,涉及Android的布局與控件設(shè)置技巧,并附帶demo源碼供讀者下載參考,需要的朋友可以參考下2016-04-04
Android開發(fā)之如何自定義數(shù)字鍵盤詳解
這篇文章主要給大家介紹了關(guān)于Android開發(fā)之如何自定義數(shù)字鍵盤的相關(guān)資料,本文語言是基于kotlin實現(xiàn)的,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧。2017-09-09
淺析Flutter AbsorbPointer 與 IgnorePointer的區(qū)別
Flutter是Google一個新的用于構(gòu)建跨平臺的手機App的SDK。這篇文章主要介紹了Flutter AbsorbPointer 與 IgnorePointer的區(qū)別,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-04-04
Kotlin協(xié)程flowOn與線程切換超詳細(xì)示例介紹
這篇文章主要介紹了Kotlin協(xié)程flowOn與線程切換,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-09-09
Andriod?Studio實現(xiàn)撥打電話和發(fā)送短信的示例代碼
這篇文章主要介紹了Andriod?Studio實現(xiàn)撥打電話和發(fā)送短信功能,Android?Studio中創(chuàng)建項目,然后在該項目中創(chuàng)建一個Module名稱為“IntentDial”,文章結(jié)合實例步驟給大家介紹的非常詳細(xì),需要的朋友參考下吧2022-03-03

