Объявление синглетонов в котлине - PullRequest
0 голосов
/ 01 мая 2018

У меня есть этот код для получения одноэлементного экземпляра моей базы данных Room, но во всем моем коде я получаю предупреждения lint при использовании Dao, что это может вызвать исключение нулевого указателя, потому что 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
        }
    }
}

Я попытался выяснить, могу ли я использовать частную и общедоступную переменную экземпляра, где у публики будет собственный пользовательский метод get и делать то, что делает getInstance, но я не могу передать в него контекст.

Так как getInstance действительно никогда не вернет ноль, как я могу настроить все так, чтобы ошибка линта исчезла?

И нет, я не хочу просто подавлять ошибку lint

Ответы [ 3 ]

0 голосов
/ 01 мая 2018

Я думаю, вы можете сделать это так:

companion object {
    private val instance: DatabaseInstance = DatabaseInstance()
    fun getInstance(): DatabaseInstance {
        return instance
    }
}

Поправьте меня, если я беспокоюсь, но я думаю, что ваш экземпляр будет инициализирован только один раз.

0 голосов
/ 02 мая 2018

Вы можете воспользоваться оператором Элвиса для возврата ненулевого 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-советы для комнаты

0 голосов
/ 01 мая 2018

Ваш getInstance(Context) возвращает необязательный тип. Вместо этого заставьте его вернуть DatabaseInstance, используя оператор !! для INSTANCE.

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!!
}

Но имейте в виду, что ваша общая реализация не является поточно-ориентированной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...