首页 > 解决方案 > Kotlin 实现具有更新能力的惰性 var 的最佳方法

问题描述

使用延迟初始化、私有设置器和使用昂贵方法更改值的能力来实现变量的最佳方法是什么?

我的意思是这样的:

private const val NO_INIT = "noInit"

class LazyUpdatableVarClass {
    private val initValue by lazy { expensive() }
    var value = NO_INIT
        private set
        get() {
            if (field == NO_INIT) {
                field = initValue
            }
            return field
        }

    fun updateValue() {
        value += expensive()
    }

    private fun expensive() = "hello"
}

这是最短和最好的方法吗?我认为自定义委托并不短,因为我需要一个实现。或者也许有图书馆代表?

使用示例:

val example = LazyUpdatableVarClass()
assertEquals("hello", example.value)
example.updateValue()
assertEquals("hellohello", example.value)

标签: kotlindelegateslazy-initialization

解决方案


可变的自定义委托对value您没有帮助,因为您不能使用委托的私有设置器(或任何自定义设置器/获取器)。

实现此 API 的更简洁的方法是声明valueval并使用可变的支持属性( _value):

class LazyUpdatableVarClass {
    private lateinit var _value: String
    private fun getValueOrInit(): String {
        if (!::_value.isInitialized) _value = expensive()
        return _value
    }

    fun updateValue() {
        _value = getValueOrInit() + expensive()
    }

    val value get() = getValueOrInit()

    private fun expensive() = "hello"
}

推荐阅读