Intereting Posts
Как издеваться над объектом Котлина с помощью Mockito / PowerMockito? LIBGDX: setPasswordMode не работает Наследование в Котлине Kotlin: Можете ли вы использовать именованные аргументы для varargs? Наблюдаемые трансформаторы из объектов Использование возврата внутри лямбда? Как имитировать или достигать отношения IS-A для классов данных Kotlin Функция расширения Котлина на изменчивом свойстве Предоставляет ли Kotlin какие-либо реализации своих интерфейсов сбора данных? Как я могу получить перечисление Kotlin одинакового поведения как cpp Котлин || Как отличить идентификатор вида от onClick () как оператор switch в Android? Android Kotlin передает значение с текстовых полей на numberPicker Преобразует ли файл Kotlin в java, добавив к нему java-код и вернувшись обратно в Kotlin так же, как добавление кода непосредственно в файл Kotlin? Проверьте, прокручивается ли RecyclerView сверху (findFirstCompletelyVisibleItemPosition не работает) Kotlin REST для машинописных определений

Свойство kotlin delegate, В методе get () как я могу получить доступ к значению?

Котлин делегировал свойства, что является очень приятной особенностью. Но я выясняю, как получить и установить значения. Предположим, я хочу получить значение свойства, которое делегировано. В методе get () как я могу получить доступ к значению?

Вот пример того, как я реализовал:

class Example() { var p: String by DelegateExample() } class DelegateExample { operator fun getValue(thisRef: Any?, property: KProperty<*>): String { return "${property.name} " } operator fun setValue(thisRef: Any?, property: KProperty<*>, value: String) { println("${value.trim()} '${property.name.toUpperCase()} '") } } fun delegate(): String { val e = Example() ep = "NEW" return ep } 

Главный вопрос, который я не могу понять, – это как установить значение для фактического свойства, которому назначен класс делегирования. Когда я назначаю «NEW» для свойства p , как я могу сохранить это значение переменной p или прочитать, что новое значение передано p с get? Я что-то теряю здесь? Любая помощь будет высоко ценится. Заранее спасибо.

Просто создайте свойство в делегате, которое будет удерживать значение

 class DelegateExample { private var value: String? = null operator fun getValue(thisRef: Any?, property: KProperty<*>): String { return value ?: throw IllegalStateException("Initalize me!") } operator fun setValue(thisRef: Any?, property: KProperty<*>, value: String) { this.value = value } } 

Чтобы уточнить – делегаты не являются держателями значений, они являются обработчиками операций get / set . Вы можете посмотреть, как он работает под капотом, если вы декомпилируете свой класс Example (Инструменты -> Kotlin -> Показывать байт-код Kotlin -> Декомпилировать).

 public final class Example { // $FF: synthetic field static final KProperty[] $$delegatedProperties = ... @NotNull private final DelegateExample p$delegate = new DelegateExample(); @NotNull public final String getP() { return (String)this.p$delegate.getValue(this, $$delegatedProperties[0]); } public final void setP(@NotNull String var1) { Intrinsics.checkParameterIsNotNull(var1, "<set-?>"); this.p$delegate.setValue(this, $$delegatedProperties[0], var1); } } 

Здесь нет волшебства, просто создавая экземпляр DelegateExample и его метод get / set