Не могу использовать пользовательский геттер с делегированным свойством

Я новичок в 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
}
Другие вопросы по тегам