在这个问题上已经有几个问答,但对我来说,他们似乎谈到了不同的事情(大多数情况下是安卓的Kotlin + Dagger2 ),并不适用于我的具体情况。
我正在通过阅读this blog post来学习“短剑”。我尝试使用Kotlin,而不是使用该博客中的Java代码。
因此,House.kt as接口:
interface House {
fun prepareForWar()
fun reportForWar()
}原样BoltonsDagger.kt
class BoltonsDagger @Inject constructor(): House {
override fun reportForWar() {
println("${this.javaClass.simpleName} reporting..")
}
override fun prepareForWar() {
println("${this.javaClass.simpleName} prepared for war")
}
}原样StarksDagger.kt
class StarksDagger @Inject constructor(): House {
override fun prepareForWar() {
println("${this.javaClass.simpleName} prepared for war")
}
override fun reportForWar() {
println("${this.javaClass.simpleName} reporting..")
}
}最后是带有main函数的WarDagger.kt:
class WarDagger @Inject constructor() {
@Inject lateinit var starks: StarksDagger
@Inject lateinit var boltons:BoltonsDagger
fun prepare() {
starks.prepareForWar()
boltons.prepareForWar()
}
fun report() {
starks.reportForWar()
boltons.reportForWar()
}
}
fun main() {
val war = WarDagger()
war.prepare()
war.report()
}错误为:Exception in thread "main" kotlin.UninitializedPropertyAccessException: lateinit property starks has not been initialized。
发布于 2019-09-27 16:23:43
首先,将WarDagger更改为:
class WarDagger @Inject constructor(
private val starks: StarksDagger,
private val boltons: BoltonsDagger
) {
...
}这样,您就可以让Dagger知道应该如何创建WarDagger实例。不需要用@Inject注释构造函数字段。
我在问题中找不到dagger组件,所以让我们创建一个:
@Component
interface WarComponent {
fun provideWarDagger(): WarDagger
}我们正在通过组件访问WarDagger的一个实例,这样客户端就可以获得它的一个实例。
现在,在main中,您应该从dagger组件中检索它,而不是手动创建WarDagger的实例,因为这就是您使用DI框架的全部原因,不是吗?客户端不应该知道依赖关系是如何创建的:
fun main() {
val component = DaggerWarComponent.create()
val war = component.provideWarDagger()
war.prepare()
war.report()
}https://stackoverflow.com/questions/58129309
复制相似问题