属性代理
package com.xingzhi.ui
import kotlin.reflect.KProperty
class Example{
var p:String by Delegate() //属性也可以使用by关键字委托给其他对象
}
//委托了
class Delegate{
operator fun getValue(thisRef:Any?,property:KProperty<*>):String {
return "$thisRef, 这里委托了 ${property.name} 属性"
}
operator fun setValue(thisRef: Any?,property: KProperty<*>,value: String){
print("$thisRef 的${property.name} 属性默认值为 $value")
}
}
fun main(){
println(Example().p)
}
kotlin在标准库中提供的预设行数
import kotlin.reflect.KProperty
class Example{
val p:String by lazy {"这个可以有"}//lazy为我们生成一个委托对象,这样在获取属性值的时候就会执行lazy 里面的操作了,
// 看起来效果就像延迟执行一样,由于只能获取,所以所只支持val变量
}
fun main(){
println(Example().p)
}
设置观察者
import kotlin.properties.Delegates
class Example{
var p:String by Delegates.observable("我就是这么任性"){
prop,old,new ->
println("检测到$prop 的值发生变化,就值$old,->新值 :$new")
}
}
fun main(){
Example().p = "这个不可能"
}
//打印的内容
检测到property p (Kotlin reflection is not available) 的值发生变化,就值我就是这么任性,->新值 :这个不可能
属性也可以直接将自己委托给另外一个属性(可以理解为给另外一个属性起个别名)
class Example(var a:String){
var p:String by ::a
}
fun main(){
val example = Example("什么说")
println(example.p)
}
属性也可以被委托给一个Map来进行存储
class User(map:MutableMap<String,Any>){
var name :String by map //直接魏国给外部闯入的Map 集合
var age:Int by map //变量的只从Map中进行存储
override fun toString(): String {
return "名字: $name , 年龄 : $age"
}
}
fun main(){
val map:MutableMap<String ,Any> = mutableMapOf(
"name" to "zhiguiCai",
"age" to 30
)
val user = User(map)
println(user) //名字: zhiguiCai , 年龄 : 30
map["age"] = 12
println(user) //名字: zhiguiCai , 年龄 : 12
}
柏码知识库 | Kotlin(一)基础语法
柏码知识库 | Kotlin(二)类与对象
柏码知识库 | Kotlin(三)高级特性