kotlin所谓高大上的委托属性理解
程序员文章站
2024-02-22 23:05:35
...
说实话,我java开发听到这个委托感觉高大上,没听过也不知道什么叫委托,现在 我感觉无非就是监听一个变量的set get调用。
类似java设置一个监听一样.
fun main(args: Array<String>) {
var hello: String by DelegateListener();
println("value ${hello}")
hello = "xxxx";
println("value ${hello}")
class DelegateClass {
var fuck: String by DelegateListener();
}
var currentClass = DelegateClass()
println("fuck" + currentClass.fuck);
currentClass.fuck = " shit";
println("fuck" +currentClass.fuck);
}
class DelegateListener {
//感觉这个东西有点罗嗦,又必须getValue setValue这样写,改名字了就报错了 感觉还没java的setget 里面 做监听 好用 呢。 属性 委托给我的感觉就是类似 监听一个变量的访问 和 赋值
operator fun getValue(thisRef: Any?, property: KProperty<*>): String {
var thisRefClassName = thisRef?.javaClass?.name;//zai
return "getValue被调用,thieRef:$thisRefClassName,property name: '${property.name}' "
}
operator fun setValue(thisRef: Any?, property: KProperty<*>, valueCurrent: String) {
var thisRefClassName = thisRef?.javaClass?.name;//zai
//如果 委托的属性没有放到对象里面 那么 thisRef是null引用 。
println("setValue传递的value=$valueCurrent :property.name (也就是变量名非参数变量名): ${property.name} property.getter.name =${property.getter.name} thisRef: $thisRefClassName.'")
}
下面是输出日志
/*
value getValue被调用,thieRef:null,property name: 'hello'
setValue传递的value=xxxx :property.name (也就是变量名非参数变量名): hello property.getter.name =<get-hello> thisRef: null.'
value getValue被调用,thieRef:null,property name: 'hello'
fuckgetValue被调用,thieRef:TestMainKt$main$DelegateClass,property name: 'fuck'
setValue传递的value= shit :property.name (也就是变量名非参数变量名): fuck property.getter.name =<get-fuck> thisRef: TestMainKt$main$DelegateClass.'
fuckgetValue被调用,thieRef:TestMainKt$main$DelegateClass,property name: 'fuck'
*/
- 可以看出来在property.getter.name 可以直接取变量名 叫啥,
- 可以监听一个变量的赋值和访问,
- 当 委托的的属性放到 main入口 获取不到 引用,但是 放到class类作为 就可以获取到对象引用.
暂时只知道有这些作用,能干嘛不懂,哈哈
class User {
var name: String by Delegates.observable("defaulvalue") { prop, oldValue, newValue ->
println("onChane: $oldValue -> $newValue , prop.name : ${prop.name} ")
"aaa"//zheli 这里 没有意义 ,语法也不报错。。。
}
}
var user = User()
println("User.name :${user.name}")
user.name = "fff";//触发 onChange
println("User.name :${user.name}")
user.name = "ggg"
println("User.name :${user.name}")
还是觉得高大上,这风骚的写法我是不会定义,慢慢来。简单的先学。
推荐阅读