前言
偶然间看到了这个关于Dagger小技巧的系列,很实用,也不复杂,在此我搬运转述一下。本文并非翻译,只是概述,想要更详细地了解,请查看原文:
Dagger Party Tricks: Extension Functions
其它技巧:
Dagger小技巧之OkHttp延迟初始化
Dagger小技巧之私有依赖
Dagger与Kotlin扩展函数
扩展函数是Kotlin中一项广受欢迎也十分强大的特性,那么我们可以在Dagger中使用扩展函数吗?当然可以了,虽然有时候这有些反直觉,但是扩展函数的确可以简化Dagger代码。
From:
@Binds
abstract Taco bindTaco(TacoImpl tacoImpl);
To:
@Binds
abstract fun TacoImpl.bindTaco(): Taco
这也可以?当然,本质上第二种Kotlin的扩展函数就对应了第一种Java的方法。同样可以用于@Provide
:
@IsLowRam
@Provides
fun ActivityManager.isLowRam() = isLowRamDevice()
Kotlin扩展函数的写法从语义上讲是更加清晰的,只是如果你不了解它在Java上的实现的话,那可能不太清楚这是在干什么。
除此之外,我们还可以使用扩展属性,这对接口类型的Module而言很有用:
@Module
interface AppActionsModule {
@get:Binds
val TacoImpl.bindTaco: Taco
}
这是因为,在接口中定义一个属性,实际上就是定义了一个与之对应的get
方法。我个人也很认同并且推荐这种写法,简洁明了,表意清晰。
如果还需要需要加@Qualifier
的话,也没问题:
@Binds
abstract fun @receiver:YourQualifier TacoImpl.bindTaco(): Taco
如果你不清楚@get:Binds
,@receiver:YourQualifier
是什么意思的话,请查看注解使用处目标(Annotation Use-site Targets)。
网友评论