Свойство 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

Intereting Posts
Как получить многомерный примитивный класс массива в котлин? Kotlin: исключить null из списка (или другого функционального преобразования) Как разделить строку с набором разделителей и найти, что это за разделитель? Котлин Вызвано: android.database.sqlite.SQLiteException: рядом с «org»: синтаксическая ошибка (код 1): при компиляции: Доступ к статическому полю из Java-суперкласса Как создать асинхронный вызов с помощью дооснащения и наблюдения в Котлине? Каково место в иерархии типов типов с возможностью NULL? MyBatis с неизменяемыми классами данных в Котлине Как преобразовать CharArray / Array <Char> в строку? Как я могу получить перечисление Kotlin одинакового поведения как cpp Возврат из функции в Kotlin как однострочный, когда объект равен нулю Android – Kotlin – объект должен быть объявлен абстрактным или реализовать абстрактный элемент Android Kotlin – Не удается вызвать onNavigationItemSelected метод Может ли класс данных Kotlin иметь более одного конструктора? Каков самый быстрый или простой способ расчета скользящего среднего в Котлине?