kotlin属性代理
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了kotlin属性代理相关的知识,希望对你有一定的参考价值。
参考技术A kotlin属性代理官方文档地址: http://kotlinlang.org/docs/reference/delegated-properties.htmlkotlin的代理模式需要实现一个接口,而属性代理只需要实现getValue和setValue方法即可。
语法形式: val/var <property name>: <Type> by <expression>
其中 <expression> 代理了 <property name> 的getValue和setValue方法。
举个🌰:
输出: Example@33a17727, thank you for delegating ‘p’ to me!
当我们给p赋值的时候,setValue会被调用
输出: NEW has been assigned to ‘p’ in Example@33a17727.
自定义属性代理也可以实现ReadWriteProperty、ReadOnlyProperty接口。
当变量第一次被使用时才进行初始化,可以实现懒加载。
lazy方法返回一个Lazy<T>对象,入参是一个lambda。
当第一次获取lazyValue的值时,会先初始化lazyValue,然后把值保存起来,下一次获取lazyValue时直接获取保存好的值即可。
输出:
初始化lazyValue的过程默认是线程安全的,通过synchronized锁来保证。
不过这肯定是影响性能的,如果我们确信lazyValue的初始化不会涉及到多线程,那么我们可以传入LazyThreadSafetyMode.NONE来取消同步锁。
LazyThreadSafetyMode有三种模式:SYNCHRONIZED(默认模式)、PUBLICATION、NONE
其中PUBLICATION模式使用了AtomicReferenceFieldUpdater(原子操作)允许多个线程同时调用初始化流程。
变量被赋值时会发出通知。
Delegates.observable可以传入两个参数,一个是初始值,另一个是变量被赋值时的handle方法。
输出:
注意:只要 user.name被赋值,监听事件就会触发。
类似的还有 vetoable() ,只不过vetoable是在赋值前触发,observable是在赋值后触发。
vetoable还可以对赋值操作进行拦截。
输出:
把map中某个key值映射为变量。
输出:
我们可以干预代理类的创建过程。提供provideDelegate方法即可,该方法返回要创建的代理对象。
provideDelegate方法有两个参数,参数1是代理属性所在的类,即image所在的类:MyUI。参数2是代理属性的具体参数对像(包括属性名称,属性类型等等)。
以上是关于kotlin属性代理的主要内容,如果未能解决你的问题,请参考以下文章
Kotlin Vocabulary | Kotlin 内建代理