Dagger小技巧之Kotlin擴(kuò)展函數(shù)

前言

偶然間看到了這個(gè)關(guān)于Dagger小技巧的系列,很實(shí)用,也不復(fù)雜,在此我搬運(yùn)轉(zhuǎn)述一下。本文并非翻譯,只是概述,想要更詳細(xì)地了解,請(qǐng)查看原文:
Dagger Party Tricks: Extension Functions

其它技巧:
Dagger小技巧之OkHttp延遲初始化
Dagger小技巧之私有依賴

Dagger與Kotlin擴(kuò)展函數(shù)

擴(kuò)展函數(shù)是Kotlin中一項(xiàng)廣受歡迎也十分強(qiáng)大的特性,那么我們可以在Dagger中使用擴(kuò)展函數(shù)嗎?當(dāng)然可以了,雖然有時(shí)候這有些反直覺,但是擴(kuò)展函數(shù)的確可以簡化Dagger代碼。

From:

@Binds
abstract Taco bindTaco(TacoImpl tacoImpl);

To:

@Binds
abstract fun TacoImpl.bindTaco(): Taco

這也可以?當(dāng)然,本質(zhì)上第二種Kotlin的擴(kuò)展函數(shù)就對(duì)應(yīng)了第一種Java的方法。同樣可以用于@Provide

@IsLowRam
@Provides
fun ActivityManager.isLowRam() = isLowRamDevice()

Kotlin擴(kuò)展函數(shù)的寫法從語義上講是更加清晰的,只是如果你不了解它在Java上的實(shí)現(xiàn)的話,那可能不太清楚這是在干什么。

除此之外,我們還可以使用擴(kuò)展屬性,這對(duì)接口類型的Module而言很有用:

@Module
interface AppActionsModule {
  @get:Binds
  val TacoImpl.bindTaco: Taco
}

這是因?yàn)?,在接口中定義一個(gè)屬性,實(shí)際上就是定義了一個(gè)與之對(duì)應(yīng)的get方法。我個(gè)人也很認(rèn)同并且推薦這種寫法,簡潔明了,表意清晰。

如果還需要需要加@Qualifier的話,也沒問題:

@Binds
abstract fun @receiver:YourQualifier TacoImpl.bindTaco(): Taco

如果你不清楚@get:Binds,@receiver:YourQualifier是什么意思的話,請(qǐng)查看注解使用處目標(biāo)(Annotation Use-site Targets)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容