在kotlin中宣布单身人士

时间:2018-05-01 17:49:54

标签: android kotlin android-room

我有这个代码用于获取我的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错误消失?

不,我不想只是抑制掉毛钱错误

3 个答案:

答案 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 }
    }
}

来源:Pro-tips for Room