我有这段代码用于获取我的 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/