不能使用具有委托属性的自定义获取者
我是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的专家,但这听起来不对。 通过委托给懒惰你想要初始化对象的第一个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()
方法。
但是就像之前说过的那样,它可能不是实现此类行为的最佳方式。一个简单的工厂可以做很少的开销。
虽然这不能回答你的问题,但我强烈建议不要在吸气剂中改变属性。这违反了最少惊喜的原则。 –