不能使用具有委托属性的自定义获取者

问题描述:

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

+2

虽然这不能回答你的问题,但我强烈建议不要在吸气剂中改变属性。这违反了最少惊喜的原则。 –

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

每次访问该属性时都不会创建一个新对象吗? –

+0

你是对的!我将编辑答案 –

例如,您可以使用原来的财产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()方法

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