3

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

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

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

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

fun getLabelAnimator(): ObjectAnimator {
    labelAnimator.duration = (if (isFloatingLabelAnimating) 300 else 0).toLong()
    return labelAnimator
}

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

4

3 回答 3

4

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

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

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

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

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

于 2017-09-01T14:31:23.337 回答
0

最短的版本

private val labelAnimator: ObjectAnimator by lazy {
    ObjectAnimator.ofFloat(this, "floatingLabelFraction", 0f, 1f).apply {
        duration = if (isFloatingLabelAnimating) 300L else 0L
    }
}
于 2018-12-22T07:43:15.137 回答
0

我不是 Kotlin 专家,但对我来说这听起来不对。通过委托给惰性,您希望在其第一次 getter 调用时初始化对象。然后,您正在尝试编写自定义 getter。我看到那里有冲突。

也许:

private val labelAnimator: ObjectAnimator by lazy {
    val labelAnimator = ObjectAnimator.ofFloat(this, "floatingLabelFraction", 0f, 1f)
    labelAnimator.duration = (if (isFloatingLabelAnimating) 300 else 0).toLong()
    labelAnimator
}
于 2017-09-01T12:14:29.500 回答