/**
* 屬性代理
* 1.類中的val和var屬性都可以使用代理進行延遲加載
* 2.類中的val屬性對應(yīng)的代理需要有g(shù)etValue()方法
* 3.類中的var屬性對應(yīng)的代理需要有g(shù)etValue()和setValue()方法
*/
class Delegates {
val helloWorld by lazy { //此處的by lazy是使用了Lazy.kt中的getValue()方法
"HelloWorld"
}
val hello by X() //屬性hello用X類進行代理
var world by Y() //屬性world用Y類進行代理
}
class X { //X類實現(xiàn)getValue方法之后,可以為val屬性進行代理
operator fun getValue(thisRef: Any?, property: KProperty<*>): String {
println("getValue:$thisRef -> ${property.name}")
return "Hello"
}
}
class Y { //Y類實現(xiàn)getValue和setValue()方法之后,可以為val和var屬性進行代理
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
}
}
fun main(args: Array<String>) {
val delegates = Delegates()
println(delegates.helloWorld)
println(delegates.hello)
println(delegates.world) //此時屬性world的值為空字符串
delegates.world = "I like this world" //為屬性world設(shè)置新的值
println(delegates.world)
}
運行結(jié)果