9.属性代理

定义-val/var: by
代理者需要实现相应的setValue/getValue方法
如果是val修饰的属性只需要具备getValue()方法
by关键字实际上就是一个属性代理运算符重载的符号,任何一个具备属性代理规则的类,都可以使用by关键字对属性进行代理
可以简单理解为属性的setter、getter访问器内部实现是交给一个代理对象来实现
例如kotlin中内置属性代理lazy,当变量第一次被使用时才进行初始化,可以实现懒加载

val hello by lazy {
    "HelloWorld"
}

自定义属性代理

class X{
    private var value: String? = null

    operator fun getValue(thisRef: Any?, property: KProperty<*>): String {
        println("getValue: $thisRef -> ${property.name}")
        return value?: ""
    }

    operator fun setValue(thisRef: Any?, property: KProperty<*>, value: String){
        println("setValue, $thisRef -> ${property.name} = $value")
        this.value = value
    }
}
var hello3 by X()
fun main() {
    println(hello3)
    hello3="111"
}

打印:
getValue: null -> hello3
setValue, null -> hello3 = 111

你可能感兴趣的:(9.属性代理)