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