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