欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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}")

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