Не могу использовать пользовательский геттер с делегированным свойством
Я новичок в 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
}
Но я не могу использовать пользовательский метод получения, так как свойство делегировано. Как мне достичь этого наилучшим образом?
2 ответа
Например, вы можете использовать свое исходное свойство в качестве 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
}
Это дает вам getLabelAnimator()
метод в Java и прямой доступ к собственности в Kotlin.
Но, как было сказано несколько раз ранее, это может быть не лучшим способом реализовать такое поведение. Простая фабрика может сделать то же самое с небольшими накладными расходами.
Самая короткая версия
private val labelAnimator: ObjectAnimator by lazy {
ObjectAnimator.ofFloat(this, "floatingLabelFraction", 0f, 1f).apply {
duration = if (isFloatingLabelAnimating) 300L else 0L
}
}
Я не эксперт Kotlin, но это звучит неправильно для меня. Передавая lazy, вы хотите инициализировать объект при первом вызове getter. А затем вы пытаетесь написать пользовательский геттер. Я вижу конфликт там.
Может быть:
private val labelAnimator: ObjectAnimator by lazy {
val labelAnimator = ObjectAnimator.ofFloat(this, "floatingLabelFraction", 0f, 1f)
labelAnimator.duration = (if (isFloatingLabelAnimating) 300 else 0).toLong()
labelAnimator
}