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

Я новичок в 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, поскольку свойство делегировано. Как я могу достичь этого наилучшим образом?

Solutions Collecting From Web of "Невозможно использовать пользовательский getter с делегированным свойством"

Например, вы можете использовать свое исходное свойство как свойство 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 и прямой доступ к свойствам в Котлине .

Но, как это было сказано несколько раз раньше, это может быть не лучший способ реализовать такое поведение. Простая фабрика могла бы сделать то же самое с небольшими накладными расходами.

Я не эксперт по Котлину, но это звучит неправильно. Делегируя, чтобы ленивый, вы хотите, чтобы объект init выполнял свой первый геттер-вызов. И тогда вы пытаетесь написать пользовательский getter. Я вижу там конфликт.

Может быть:

 private val labelAnimator: ObjectAnimator by lazy { val labelAnimator = ObjectAnimator.ofFloat(this, "floatingLabelFraction", 0f, 1f) labelAnimator.duration = (if (isFloatingLabelAnimating) 300 else 0).toLong() labelAnimator }