无法将自定义 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
}
}
我是 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
}
}