简书链接:kotlin所谓高大上的委托属性理解
文章字数:484,阅读全文大约需要1分钟
说实话,我java开发听到这个委托感觉高大上,没听过也不知道什么叫委托,现在 我感觉无非就是监听一个变量的set get调用。
类似java设置一个监听一样.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
|
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.'") }
|
下面是输出日志
1 2 3 4 5 6 7 8
| /* 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类作为 就可以获取到对象引用.
暂时只知道有这些作用,能干嘛不懂,哈哈
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| 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}")
|
还是觉得高大上,这风骚的写法我是不会定义,慢慢来。简单的先学。