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

Can't use custom getter with delegated property

我是 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,因为 属性 已被委托。 我如何以最佳方式实现这一目标?

我不是 Kotlin 专家,但我觉得这听起来不对。 通过委托给 lazy,您希望在第一次 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
}

例如,您可以将原来的 属性 用作 Backing Property,并实际将 属性 定义为它的委托。

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

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

这为您提供了 Java 中的 getLabelAnimator() 方法和 Kotlin[=21= 中的直接 属性 访问].

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

最短版本

private val labelAnimator: ObjectAnimator by lazy {
    ObjectAnimator.ofFloat(this, "floatingLabelFraction", 0f, 1f).apply {
        duration = if (isFloatingLabelAnimating) 300L else 0L
    }
}