美文网首页
委托属性

委托属性

作者: 主音King | 来源:发表于2018-12-05 17:28 被阅读1次

    场景:有一些属性,在需要的时候才创建。并且只实现一次。
    延迟属性:首次访问时计算
    可观察属性:监听器收到有关此属性变量的通知
    把多个属性存储在一个映射中。
    语法:val/var <属性名>:<类型>by<表达式>
    属性的委托需要提供getValue和setValue

    class Delegate {
        operator fun getValue(thisRef: Any?, property: KProperty<*>): String {
            println("测试-getValue")
            return "$thisRef, thank you for delegating '${property.name}' to me!"
        }
    
        operator fun setValue(thisRef: Any?, property: KProperty<*>, value: String) {
            println("$value has been assigned to '${property.name}' in $thisRef.")
        }
    }
    

    声明和使用(只有在使用的时候才会实现委托):

    var p: String by Delegate()
    println("测试-${p}")
    

    注意:在debug中虽然没有使用p,但是会走委托的实现但是捕获不到断点(就算你在getValue中打断点,它确实走了这个方法,log中也打印了,但是就是断点不到它的执行过程)。

    延迟属性 Lazy
    默认lazy属性的求值是同步锁(synchronized)是最安全的
    LazyThreadSafetyMode.PUBLICATION:不需要同步锁
    LazyThreadSafetyMode.NONE:线程不安全

        val lazyValue: String by lazy{
            println("测试-go")
            "测试-hello"
        }
    

    执行:第一次会唱诶lazy()并记录结果,第二次会直接返回记录结果

            println(lazyValue)
            println(lazyValue)
    

    latent var
    让编译期忽略对属性未初始化的检查,后续在哪里以及何时初始化开发者决定,比by lazy代价小点
    lateinit var 是否初始化(1.2起)使用 .isInitialized

    相关文章

      网友评论

          本文标题:委托属性

          本文链接:https://www.haomeiwen.com/subject/ehuwcqtx.html