Kotlin Назначаемые Generi c Проблема Ленивых Nullabillity - PullRequest
0 голосов
/ 15 февраля 2020

Я хочу загрузить данные ленивый из базы данных (на Android с комнатой)

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

Я хочу, чтобы у меня была функция для получения моего значения в форме fun get(): T, где T можно обнулять.

Проблема, с которой я сталкиваюсь, заключается в том, что мне нужны две функции, если я хочу одну, возвращающую T и одну T? но хочу только одного. Мой код для назначения ленивый:

sealed class LazyDBLoad<T, D> {
    abstract fun getNullable() : T?
    abstract fun get(): T

    companion object {
        fun <T, D> of(dependency: D, onLoad: (D) -> T) : LazyDBLoad<T, D> {
            return LazyDBLoadImpl(dependency, onLoad)
        }
    }

    private class LazyDBLoadImpl<T, D>(
        private val dependency: D,
        private val onLoad: (D) -> T) : LazyDBLoad<T, D>(){

        private var wasLoaded = false
        private var loaded: T? = null

        override fun getNullable(): T? {
            if (!wasLoaded) {
                wasLoaded = true
                loaded = onLoad(dependency)
            }
            return loaded
        }

        override fun get(): T {
            return getNullable() ?: throw Exception("Not Nullable was null")
        }

    }
}

Пример использования:

var accessCount: Int = 0
val databaseResult: Int
    get() = if (accessCount < 1) {accessCount = accessCount.inc();4711} else {println("Too many accesses");-1}

fun main() {
    val dependency = Any()
    val lazyProperty: LazyDBLoad<Int, Any> = LazyDBLoad.of(dependency) {
        return@of databaseResult
    }
    val value: Int? = lazyProperty.getNullable()
    val value2: Int = lazyProperty.get()
    val lazyPropertyNull: LazyDBLoad<Int?, Any> = LazyDBLoad.of(dependency){null}
    val get = lazyPropertyNull.getNullable() //works
    val get2 = lazyPropertyNull.get() // Error but because of types no compile error
}
...