无法将自定义 getter 与委托属性一起使用

Pra*_*arg 3 getter properties kotlin delegated-properties

我是 kotlin 新手,无法弄清楚这个问题。

我有一个不可为 null 的属性,可能会也可能不会使用。因此,我以一种惰性的方式委托它,以便在需要时对其进行初始化。

private val labelAnimator: ObjectAnimator by lazy {
    ObjectAnimator.ofFloat(this, "floatingLabelFraction", 0f, 1f)
}
Run Code Online (Sandbox Code Playgroud)

但是,我还需要在每次访问该对象时设置该对象的一些属性。

fun getLabelAnimator(): ObjectAnimator {
    labelAnimator.duration = (if (isFloatingLabelAnimating) 300 else 0).toLong()
    return labelAnimator
}
Run Code Online (Sandbox Code Playgroud)

但我无法使用自定义 getter,因为该属性是委托的。我如何以最好的方式实现这一目标?

tyn*_*ynn 5

例如,您可以使用原始属性作为支持属性,并实际将该属性定义为对其的委托。

private val _labelAnimator by lazy {
    ObjectAnimator.ofFloat(this, "floatingLabelFraction", 0f, 1f)
}

val labelAnimator: ObjectAnimator
    get() {
        _labelAnimator.duration = if (isFloatingLabelAnimating) 300L else 0L
        return _labelAnimator
    }
Run Code Online (Sandbox Code Playgroud)

这为您提供了JavagetLabelAnimator()中的方法和Kotlin中的直接属性访问。

但就像之前多次说过的那样,这可能不是实现这种行为的最佳方式。一个简单的工厂只需很少的开销就可以做同样的事情。