美文网首页
委托属性

委托属性

作者: 主音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

相关文章

  • Kotlin-委托,是否被低估了?

    1、属性委托 kotlin中的委托主要分为类的委托和属性的委托,我们先重点来看属性委托,用的比较多。 标准委托 k...

  • Kotlin学习笔记(2)Kotlin委托代码示例

    1,class委托 2,属性委托

  • 委托属性

    场景:有一些属性,在需要的时候才创建。并且只实现一次。延迟属性:首次访问时计算可观察属性:监听器收到有关此属性变量...

  • Kotlin-委托剖析(2)- 属性委托

    简单例子 以下是属性委托的代码, 属性b委托给了属性a,a、b两者数据同步。Tips:可空属性好像不能成为委托对象...

  • iOS学习笔记:添加delegate

    1、委托者添加代理. 2、委托者申明一个属性:委托者里得有一个属性代表被委托者, 注意这个属性是弱引用. 3、被委...

  • 运算符重载 高阶函数

    委托属性class Foo{var p:Type by Delegate()} 使用委托属性: 惰性初始化 和 b...

  • Kotlin-map属性委托

    Kotlin-map属性委托 委托属性在实际开发中是有如下4种使用情况的 1、延迟属性。 2、可观测属性。 3、非...

  • Kotlin | 委托(Delegation)详解

    本文要点概述 辨析委托模式与代理模式 接口委托(Delegated interface) 属性委托(Delegat...

  • Kotlin的委托属性

    委托属性的语法 val/var <属性名>:<类型> by <表达式>在by后面的表达式是改委托,因为属性对应的g...

  • kotlin—委托属性及其原理

    不仅类可以使用委托,属性也可以使用委托,本章节我们介绍委托属性及其实现原理 1、语法 语法如下:var/val p...

网友评论

      本文标题:委托属性

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