kotlin属性代理

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了kotlin属性代理相关的知识,希望对你有一定的参考价值。

参考技术A kotlin属性代理官方文档地址: http://kotlinlang.org/docs/reference/delegated-properties.html

kotlin的代理模式需要实现一个接口,而属性代理只需要实现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 -by 详解

Kotlin -by 详解

Kotlin Vocabulary | Kotlin 内建代理

kotlin的哪个功能可以替代通过Java代理进行的方法拦截

当Kotlin邂逅设计模式之代理模式

Kotlin Vocabulary | Kotlin 内建代理