首页 > 解决方案 > 当我用类 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()
    }
}

标签: kotlindependency-injectiondagger-hilt

解决方案


通过提供的链接,您回答了自己的答案。正如它所说:

在 Kotlin 中,仅包含 @Provides 函数的模块可以是对象类。这样,提供者在生成的代码中得到优化并几乎内联。

所以是的,你是对的,两个模块都可以工作,但是对象模块会自动优化。不要忘记,Kotlin 对象是一个静态类,因此永远不可能有它的两个实例(对于匕首编译器来说可能更容易?)


推荐阅读