当我用 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 编译器来说可能更容易?)