android - 在 kotlin 中声明单例

标签 android kotlin android-room

我有这段代码用于获取我的 Room 数据库的单例实例,但在我的所有代码中,我在使用 Dao 时收到 lint 警告,它可能导致空指针异常,因为 getInstance 可以返回可为 null 的值

abstract class DatabaseInstance : RoomDatabase() {

    // ... Dao's

    companion object {
        private var INSTANCE: DatabaseInstance? = null

        fun getInstance(context: Context): DatabaseInstance? {
            if (INSTANCE == null) {
                synchronized(DatabaseInstance::class) {
                    INSTANCE = Room.databaseBuilder(context.applicationContext,
                        DatabaseInstance::class.java, "my_database.db")
                        .allowMainThreadQueries().fallbackToDestructiveMigration().build()
                }
            }
            return INSTANCE
        }

        fun destroyInstance() {
            INSTANCE = null
        }
    }
}

我试着看看我是否可以使用一个私有(private)和公共(public)实例变量,其中公众将有一个自定义 getter 并执行 getInstance 所做的事情,但我无法将上下文传递给它。

因为 getInstance 真的永远不会返回 null,我该如何调整才能消除 lint 错误?

不,我不想只抑制 lint 错误

最佳答案

您的 getInstance(Context) 返回可选类型。而是使用 INSTANCE 上的 !! 运算符使其返回 DatabaseInstance

fun getInstance(context: Context): DatabaseInstance {
    if (INSTANCE == null) {
        synchronized(DatabaseInstance::class) {
            INSTANCE = Room.databaseBuilder(context.applicationContext,
                DatabaseInstance::class.java, "my_database.db")
                .allowMainThreadQueries().fallbackToDestructiveMigration().build()
        }
    }
    return INSTANCE!!
}

但请记住,您的整体实现不是线程安全的。

关于android - 在 kotlin 中声明单例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50121270/

相关文章:

kotlin - 只能在协程体错误内调用挂起函数

java - 将我的Kotlin Maven发布代码转换为Java Gradle插件

java - Android Room-插入之前如何检查同名实体?

java - 使用 room 从两个表中获取一个对象中的两个列表

android - IntentService android下载并返回文件到Activity

安卓 : Crouton lib and custom font

kotlin - 类型转换以满足多种类型约束

java - 卡住了设置 Room 以与 RxJava 一起使用 : access to database may potentially lock the UI

android - 模拟 Android 的低网络连接

Android eclipse,更改最低 SDK 版本不会触发 Lint 错误