Как получить имя переменной в Kotlin? - PullRequest
0 голосов
/ 07 ноября 2018

У меня в приложении есть класс Kotlin с большим количеством атрибутов, и я хочу построить метод, который сохраняет имя переменной в словаре. Словарь выглядит так:

HashMap<String, Pair<Any, Any>>()

Целью этого является сохранение изменений, внесенных в определенный атрибут, я сохраняю имя переменной в качестве ключа, а в паре я сохраняю старое значение и новое значение. Для уведомления об изменениях я использую шаблон Observer. Таким образом, всякий раз, когда сеттер вызывается из атрибута, об изменении будет сообщено и сохранено в словаре.

Приведенный ниже код приводит к следующему:

var person = Person("Harry", 44)
person.age = 45

HashMap("age", (44, 45))

Сейчас я просто прописываю имя переменной в виде строки, поэтому мой вопрос:

Как динамически получить имя переменной в Kotlin?

Я видел тот же вопрос в Java: Отражение Java: Как получить имя переменной?

Также некоторые другие вопросы по той же теме, утверждающие, что это невозможно: Получить свойство name переменной

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

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

Как указано в документации Kotlin о Reflection :

val x = 1

fun main() {
    println(::x.get())
    println(::x.name) 
}

Выражение ::x оценивается как объект свойства типа KProperty<Int>, что позволяет нам читать его значение, используя get(), или извлекать имя свойства, используя свойство name.

0 голосов
/ 07 ноября 2018

Я думаю, что свойства делегата - это решение моей проблемы:

class Delegate {
operator fun getValue(thisRef: Any?, property: KProperty<*>): String {
    return "$thisRef, thank you for delegating '${property.name}' to me!"
}

operator fun setValue(thisRef: Any?, property: KProperty<*>, value: String) {
    println("$value has been assigned to '${property.name}' in $thisRef.")
  }
}

Кредиты идут на: Roland Источник: https://kotlinlang.org/docs/reference/delegated-properties.html

...