【问题标题】:Cache property read from database从数据库读取的缓存属性
【发布时间】:2018-07-24 07:42:07
【问题描述】:

目前我开始学习 Kotlin。我有这样的财产:

var startTime: Int
    get() = {
        // read value from database
    }
    set(value) {
        // save value to database
    }

这里我每次使用getter和setter时总是读写值。

这个属性可以被评估为惰性吗?我想在第一次使用 getter 时读取该值并将其缓存以供后续调用。我知道值可能是懒惰的,但我没有发现关于变量的任何信息。 Kotlin 中缓存此属性的正确方法是什么?

【问题讨论】:

    标签: kotlin


    【解决方案1】:

    Kotlin 提供了在首次访问时计算并缓存的惰性属性 (https://kotlinlang.org/docs/reference/delegated-properties.html#lazy)。

    val lazyValue: String by lazy {
      println("computed!")
      "Hello"
    }
    

    fun main(args: Array<String>) {
      println(lazyValue)
      println(lazyValue)
    }
    

    会产生

    computed!
    Hello
    Hello
    

    【讨论】:

    • 是的,我知道,但我需要一个变量(有 get 和 set)而不是一个只能读取的值。
    • @Cilenco 我不明白...为什么要缓存可以更改的值?您如何知道何时从数据库中获取新值?
    • 该值只能由我的程序更改。在某些情况下,我必须经常查询该值,这会导致在数据库中一直执行此操作时性能不佳。有时我什至不需要获取值,所以延迟加载在这里会很好。
    • 只需将其更改为 var...?
    【解决方案2】:

    你需要的不是惰性求值,而是一个后备字段:

    private var _startTime: Int? = null
    
    var startTime: Int
        get() = {
            if (_startTime != null) {
                return _startTime!!
            } else {
                // read value from database and assign it to _startTime
            } 
        }
        set(value) {
            _startTime = value 
            // save value to database
        }
    

    或者,您可以将_startTime 声明为不可为空,并有一个附加标志private var isStartTimeSet: Boolean = false 用于检查它是否已经从数据库中获取。

    【讨论】:

      猜你喜欢
      • 2017-04-07
      • 2021-08-07
      • 1970-01-01
      • 2013-02-19
      • 1970-01-01
      • 2018-10-16
      • 2011-12-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多