如何在Kotlin中简化用于Android房间数据库初始化的单例?

@Database(entities = arrayOf(Book::class, User::class), version = 1)
abstract class AppDatabase : RoomDatabase() {

    abstract fun bookModel() : BookDao
    abstract fun userModel() : UserDao

    companion object {
        private var INSTANCE: AppDatabase? = null

        fun getInMemoryDatabase(context: Context): AppDatabase {
            if (INSTANCE == null) {
                INSTANCE = Room.inMemoryDatabaseBuilder(context.applicationContext, AppDatabase::class.java).build()
            }
            return INSTANCE!!
        }

        fun destroyInstance() {
            INSTANCE = null
        }
    }
}

最佳答案

您可以使用数组文字([])代替arrayOf,并且可以使用elvis运算符进行空检查。参见here

@Database(entities = [Book::class, User::class], version = 1)
abstract class AppDatabase : RoomDatabase() {

    abstract fun bookModel() : BookDao
    abstract fun userModel() : UserDao

    companion object {
        private var INSTANCE: AppDatabase? = null

        fun getInMemoryDatabase(context: Context): AppDatabase {
            INSTANCE = INSTANCE ?: Room.inMemoryDatabaseBuilder(context.applicationContext, AppDatabase::class.java).build()
            return INSTANCE!!
        }

        fun destroyInstance() {
            INSTANCE = null
        }
    }
}
由于您需要实例,因此必须将其保存在某个地方,因此使用companion object对我来说似乎是一个合理的解决方案。
如果您不希望将实例保存在AppDatabase中,也可以使用一个对象(在Kotlin中是单例)。
object AppDatabaseProvider {
    private var INSTANCE: AppDatabase? = null

    fun getInMemoryDatabase(context: Context): AppDatabase {
       // ...
    }

    fun destroyInstance() {
        INSTANCE = null
    }
}
这两个都是在Kotlin中处理静态数据的选项,但是您不会比这更短。

10-01 13:48