前言
偶然間看到了這個(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)。