当前位置 : 主页 > 网络编程 > PHP >

kotlin所谓高大上的委托属性理解

来源:互联网 收集:自由互联 发布时间:2023-09-06
说实话,我java开发听到这个委托感觉高大上,没听过也不知道什么叫委托,现在 我感觉无非就是监听一个变量的set get调用。 类似java设置一个监听一样. fun main(args: ArrayString) { var hell


说实话,我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}")

还是觉得高大上,这风骚的写法我是不会定义,慢慢来。简单的先学。

网友评论