Kotlin delegated properties

Properties jsou většinou představeny odpovídajícím polem ve třídě (např. val x: Int). Mohou ale být i delegovány. Jejich hodnota je získána od toho, na koho byla tato práce přenesena (delegována). Jinak řečeno getValue a setValue funce zajišťuje delegovaný kód. Delegované vlastnosti se používají deklarováním vlastnosti a delegáta, kterého používají.

Příklad 1

class Example {
    var property: Int by Delegate()
}

class Delegate {
    var random = Random(0)

    operator fun getValue(thisRef: Any?, property: KProperty<*>): Int {
        println("$javaClass - getting random value | thisRef -> $thisRef, property -> $property")
        return random.nextInt()
    }

    operator fun setValue(thisRef: Any?, property: KProperty<*>, value: Int) {
        println("$javaClass creating new random with seed value: $value | thisRef -> $thisRef, property -> $property")
        random = Random(value)
    }
}

fun main() {
    val e = Example()
    println(e.property)
    e.property = 10
    println(e.property)
}

Výsledek

class cz.vitfo.Delegate - getting random value | thisRef -> cz.vitfo.Example@762efe5d, property -> var cz.vitfo.Example.property: kotlin.Int
-1934310868
class cz.vitfo.Delegate creating new random with seed value: 10 | thisRef -> cz.vitfo.Example@762efe5d, property -> var cz.vitfo.Example.property: kotlin.Int
class cz.vitfo.Delegate - getting random value | thisRef -> cz.vitfo.Example@762efe5d, property -> var cz.vitfo.Example.property: kotlin.Int
-129340023

Příklad 2

class Example2 {
    var nameV2: String = "Name version 2"

    @Deprecated("Use nameV2")
    var name: String by this::nameV2
}

fun main() {
    val e2 = Example2()
    println(e2.name)
    println(e2.nameV2)
}

Výsledek

Name version 2
Name version 2

Zdroje:

Napsat komentář