Marti Serra Molina
Marti Serra Molina

Reputation: 473

Delegated properties inside functions

I don't really understand why we can use delegated properties inside functions. We cannot create properties inside functions because inside functions we can only create variables.

How come is possible creating a delegated property inside a function then?

This line of code is a delegated property inside a function and I don't understand why is that possible.

val scoreFragmentArgs by navArgs<ScoreFragmentArgs>()

It has getters and setters and it doesn't make sense to me

Upvotes: 4

Views: 679

Answers (1)

Iaroslav Postovalov
Iaroslav Postovalov

Reputation: 2462

Kotlin Delegates are based on storing the delegate object, and delegating getting/setting of the changes to it. So, it is possible to inline getValue calls when accessing to delegated variable.

For example:

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)
}

The main method in Java will look like:

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]));
}

As you see, accessing the variable is replaced by calling getValue.

Upvotes: 2

Related Questions