Kotlin Android Room中的任何时候AppDatabase都可以为空吗?

Kotlin Android Room中的任何时候AppDatabase都可以为空吗?,kotlin,singleton,Kotlin,Singleton,在添加房间数据库时,建议使用Singleton设计模式 注意:在实例化AppDatabase对象时,应该遵循singleton设计模式,因为每个RoomDatabase实例都相当昂贵,并且很少需要访问多个实例 所以,在中添加Room数据库,下面是用Java编写的Google示例,如下所示 private var INSTANCE: AppDatabase? = null fun getInstance(context: Context): AppDatabase? { if (INST

在添加房间数据库时,建议使用Singleton设计模式

注意:在实例化AppDatabase对象时,应该遵循singleton设计模式,因为每个RoomDatabase实例都相当昂贵,并且很少需要访问多个实例

所以,在中添加Room数据库,下面是用Java编写的Google示例,如下所示

private var INSTANCE: AppDatabase? = null

fun getInstance(context: Context): AppDatabase? {
    if (INSTANCE == null){
        synchronized(AppDatabase::class){
            INSTANCE = Room.databaseBuilder(context.applicationContext,
                    AppDatabase::class.java, "app_database")
                    .build()
        }
    }
    return INSTANCE
}

当我调用
getInstance
时,编译器建议
getInstance
可以是
null
。所以我的问题是,是否存在
getInstance
null
的情况,我是否必须检查它是否为
null
。如果不是,那么我应该如何实例化
AppDatabase
,以便
getInstance
返回
AppDatabase
not
AppDatabase?
并且它符合文档建议?

使用类似的方法确保它不为空

object DatabaseSource {
    private lateinit var INSTANCE: AppDatabase

    fun getInstance(context: Context): AppDatabase {
        if (!::INSTANCE.isInitialized) {
            synchronized(AppDatabase::class) {
                if (!::INSTANCE.isInitialized) {
                    INSTANCE = Room.databaseBuilder(context.applicationContext,
                                                    AppDatabase::class.java,
                                                    "app_database").build()
                }
            }
        }
        return INSTANCE
    }
}
称之为:

val db = DatabaseSource.getInstance(context)
这永远不会是空的,所以你不再有这个问题

我在
getInstance()
调用中添加了双重锁定以确保线程安全

但实际上,您应该在单例中使用依赖项注入,以避免在上下文的依赖项和手动创建/锁定中传递这种依赖项。你必须让上下文无处不在,这是一个糟糕的模式


这也是一个答案,显然是这个答案的重复。

这确实是我想要的答案。但是我如何在这里传递
上下文
?因为我在我的
伴生对象中创建实例
,所以在静态字段中包含
上下文
不是一个好的做法。看,我发现他们也使用了
,效果非常好。你怎么说?你在使用依赖注入吗?因为这似乎应该作为一个单例注入,并且上下文也应该可以用于注入。关于不使用
lateinit
的注释没有普遍有效的注释。在您知道生命周期的任何上下文中,它都可以在使用之前进行实例化。在这里,访问它的唯一方法是通过确保它有效的方法。所以你很好。另一条评论在没有上下文的情况下是不相关的。我看到了您建议的volatile编辑,但因为这只是在锁定下修改的,我们正在检查是否分配了一个位字段,我相信它不会被部分设置。如果你愿意,你可以添加它,但不确定它是否真的是你想要的,只会在访问它时增加更多的争用。我们不要毫无理由地添加我们在其他帖子中看到的内容。