你好,我刚学孝允,怎么会变成这样Dagger2类中的孝允2.0提供?
@Singleton
open class AppExecutors(private val diskIO: Executor, private val networkIO: Executor, private val mainThread: Executor) {
@Inject
constructor() : this(
Executors.newSingleThreadExecutor(),
Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() + 1),
MainThreadExecutor())
fun diskIO(): Executor {
return diskIO
}
fun networkIO(): Executor {
return networkIO
}
fun mainThread(): Executor {
return mainThread
}
private class MainThreadExecutor : Executor {
private val mainThreadHandler = Handler(Looper.getMainLooper())
override fun execute(command: Runnable) {
mainThreadHandler.post(command)
}
}
}
我尝试这样做:
single<AppExecutors> { AppExecutors(
Executors.newSingleThreadExecutor(),
Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() + 1),
AppExecutors.MainThreadExecutor())
}
但是AppExecutors.MainThreadExecutor()
是私有的。是让公众唯一的解决办法?
嗯,这是一个有点古怪的念头注入的东西是从使用DI外的私人实现细节。
此外,在Dagger2解决方案是实际工作围绕依赖注入一招。
所以,你需要做的决定:我想这是一个私人implemietation细节?如果是的话我会建议使用默认参数值,只有当你需要重写例如此实现使用注射供测试用。
open class AppExecutors(
private val diskIO: Executor,
private val networkIO: Executor,
private val mainThread: Executor = AppExecutors.MainThreadExecutor()) {
和:
single<AppExecutors> { AppExecutors(
Executors.newSingleThreadExecutor(),
Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() + 1)))
}
(请注意,在科特林使用默认参数值到底是相同于原始例如使用多个构造。)
否则,你应该让公众和类提取它。