kotlin - 当我用类 DatabaseModule 替换对象 DatabaseModule 时有什么不同?
问题描述
我正在学习依赖注入,以下代码 A 来自https://developer.android.com/codelabs/android-hilt#6
看来代码 B 也可以很好地工作。
当我用类 DatabaseModule 替换对象 DatabaseModule 时有什么不同?
代码 A
@Module
object DatabaseModule {
@Provides
@Singleton
fun provideDatabase(@ApplicationContext appContext: Context): AppDatabase {
return Room.databaseBuilder(
appContext,
AppDatabase::class.java,
"logging.db"
).build()
}
@Provides
fun provideLogDao(database: AppDatabase): LogDao {
return database.logDao()
}
}
代码 B
@InstallIn(SingletonComponent::class)
@Module
class DatabaseModule {
@Provides
@Singleton
fun provideDatabase(@ApplicationContext appContext: Context): AppDatabase {
return Room.databaseBuilder(
appContext,
AppDatabase::class.java,
"logging.db"
).build()
}
@Provides
fun provideLogDao(database: AppDatabase): LogDao {
return database.logDao()
}
}
解决方案
通过提供的链接,您回答了自己的答案。正如它所说:
在 Kotlin 中,仅包含 @Provides 函数的模块可以是对象类。这样,提供者在生成的代码中得到优化并几乎内联。
所以是的,你是对的,两个模块都可以工作,但是对象模块会自动优化。不要忘记,Kotlin 对象是一个静态类,因此永远不可能有它的两个实例(对于匕首编译器来说可能更容易?)
推荐阅读
- c++ - 类向量初始化
- python - 是否可以在成功创建记录的 INSERT 操作后从 Cassandra 获得回调?
- matlab - 如何将单元格数组传递给完整文件
- frameworks - 是否有支持 USB 的 RPC 库?
- c# - VS 2019 和 MySQL Entity Framework 重复数据库名称
- vagrant - 使用 WSL 2 在 Vagrant 中拒绝连接
- visual-studio-2019 - 编辑 WorkItem 不起作用 - UI 未更新 - VS2019 ADOS 2020
- python - 从具有相同 HTML 代码的多个框中选择特定输入框
- mysql - 如何使用多案例语句优化查询
- python - 在 CVXPY 中,如何创建像 x == 1 OR x == 2 这样的 OR 约束?