Делегированные свойства внутри функций - PullRequest
2 голосов
/ 13 июля 2020

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

Почему тогда возможно создание делегированного свойства внутри функции?

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

val scoreFragmentArgs by navArgs<ScoreFragmentArgs>()

У нее есть геттеры и сеттеры, и для меня это не имеет смысла

1 Ответ

1 голос
/ 20 июля 2020

Kotlin Делегаты основаны на хранении объекта делегата и делегировании ему получения / настройки изменений. Таким образом, можно встроить вызовы getValue при доступе к делегированной переменной.

Например:

import kotlin.properties.ReadOnlyProperty
import kotlin.reflect.KProperty

object Delegate : ReadOnlyProperty<Any?, Int> {
    override fun getValue(thisRef: Any?, property: KProperty<*>): Int = 42
}

fun main() {
    val foo by Delegate
    println(foo)
}

Основной метод в Java будет выглядеть так:

   static final KProperty[] $$delegatedProperties = new KProperty[]{(KProperty)Reflection.property0(new PropertyReference0Impl(Reflection.getOrCreateKotlinPackage(MainKt.class, "123"), "foo", "<v#0>"))};

   public static void main() {
      System.out.println(Delegate.INSTANCE.getValue(null, $$delegatedProperties[0]));
   }

Как видите, доступ к переменной заменяется вызовом getValue.

...