我有这个代码用于获取我的Room
数据库的单例,但是在我的代码中,当使用Dao
它可能导致空指针异常时,我得到lint警告,因为getInstance可以返回一个可空值
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
}
}
}
我试过看看我是否可以使用私有和公共实例变量,其中public会有一个自定义getter并执行getInstance所做的但是我不能将上下文传递给它。
由于getInstance
实际上永远不会返回null,我如何调整内容以使lint错误消失?
不,我不想只是抑制掉毛钱错误
答案 0 :(得分:0)
您的$('.priority').change(function(){
$(this).parents("form").submit();
return false;
})
会返回可选类型。而是使用getInstance(Context)
上的DatabaseInstance
运算符返回!!
。
INSTANCE
但请记住,您的整体实现不是线程安全的。
答案 1 :(得分:0)
我认为你可以这样做:
companion object {
private val instance: DatabaseInstance = DatabaseInstance()
fun getInstance(): DatabaseInstance {
return instance
}
}
如果我有问题,请纠正我,但我认为您的实例只会被初始化一次。
答案 2 :(得分:0)
您可以利用Elvis operator返回非空DatabaseInstance
并避免使用!!
运算符:
private var INSTANCE: DatabaseInstance? = null
fun getInstance(context: Context): DatabaseInstance {
return INSTANCE ?: synchronized(DatabaseInstance::class) {
INSTANCE ?: Room.databaseBuilder(context.applicationContext, DatabaseInstance::class.java, "my_database.db")
.allowMainThreadQueries()
.fallbackToDestructiveMigration()
.build()
.also { INSTANCE = it }
}
}