无法使用具有委托属性的自定义getter

时间:2017-09-01 11:44:06

标签: properties kotlin getter delegated-properties

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

3 个答案:

答案 0 :(得分:1)

例如,您可以将原始属性用作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 中提供直接属性访问。

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

答案 1 :(得分:0)

我不是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
}

答案 2 :(得分:0)

最短的版本

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