当我用 class DatabaseModule 替换对象 DatabaseModule 时有什么不同?
What are there different when I replace object DatabaseModule with class DatabaseModule?
我正在学习依赖注入,以下代码A来自https://developer.android.com/codelabs/android-hilt#6
看来代码B也可以用
当我将对象 DatabaseModule 替换为 class 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()
}
}
根据提供的 link,您回答了自己的答案。正如它所说:
In Kotlin, modules that only contain @Provides functions can be object classes. This way, providers get optimized and almost in-lined in generated code.
所以是的,你是对的,两个模块都可以工作,但是对象模块会自动优化。不要忘记,Kotlin 对象是静态的 class,因此它永远不会有两个实例(对于 dagger 编译器来说可能更容易?)
我正在学习依赖注入,以下代码A来自https://developer.android.com/codelabs/android-hilt#6
看来代码B也可以用
当我将对象 DatabaseModule 替换为 class 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()
}
}
根据提供的 link,您回答了自己的答案。正如它所说:
In Kotlin, modules that only contain @Provides functions can be object classes. This way, providers get optimized and almost in-lined in generated code.
所以是的,你是对的,两个模块都可以工作,但是对象模块会自动优化。不要忘记,Kotlin 对象是静态的 class,因此它永远不会有两个实例(对于 dagger 编译器来说可能更容易?)