android - 我怎样才能在 Kotlin 中简化这个单例?

标签 android kotlin android-room

如何在 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
        }
    }
}

因为您需要实例,所以您必须将它保存在某个地方,使用伴随对象对我来说似乎是一个合理的解决方案。

如果您不想将实例保存在 AppDatabase 中,您也可以使用一个对象(在 Kotlin 中是一个单例)。

object AppDatabaseProvider {
    private var INSTANCE: AppDatabase? = null

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

    fun destroyInstance() {
        INSTANCE = null
    }
}

这些都是在 Kotlin 中处理静态数据的选项,但你不会得到比这短得多的选项。

关于android - 我怎样才能在 Kotlin 中简化这个单例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51600575/

相关文章:

android - CardView 中的 ImageView 在 Android 4.3 上不显示半径

elasticsearch - 在 Kotlin 中,如何将 Kovenant Promise 与 Elasticsearch 异步响应集成?

android - 用于检索实体键和值总和的 Room SQL 查询

java - 房间抽象 Pojo

android - Jsoup select() 在 Android 应用程序中不返回任何内容

android - 区分 iOS 和 Android Firebase 身份验证用户

android - 停止 Android 操作系统自动更新

java - 使用 Apache-POI 获取 docx 的每个段落的行

mysql - 什么相当于 Kotlin Exposed 中来自 MySQL 的显示表

android - 如何在 RecyclerView 中实现子标题/部分?