Я хочу загрузить данные ленивый из базы данных (на 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
}