当前位置: 首页 > web >正文

Kotlin 属性委托 observable 的实现原理

Kotlin 的 Delegates.observable 是 Kotlin 标准库中提供的一个属性委托,它允许你在属性的值发生变化时自动执行某段逻辑,比如常用于监听属性变化(例如 UI 数据更新)。

基本使用示例:

import kotlin.properties.Delegatesvar name: String by Delegates.observable("initial") { property, oldValue, newValue ->println("${property.name} changed from $oldValue to $newValue")
}fun main() {name = "Alice"name = "Bob"
}

输出:

name changed from initial to Alice
name changed from Alice to Bob

实现原理

1. Delegates.observable(...) 返回了一个实现了 ReadWriteProperty 接口的对象:
public inline fun <T> observable(initialValue: T, crossinline onChange: (property: KProperty<*>, oldValue: T, newValue: T) -> Unit):ReadWriteProperty<Any?, T> =object : ObservableProperty<T>(initialValue) {override fun afterChange(property: KProperty<*>, oldValue: T, newValue: T) = onChange(property, oldValue, newValue)}

它返回了一个 ObservableProperty 实例。

2. ObservableProperty 实现了属性委托接口ReadWriteProperty
public abstract class ObservableProperty<V>(initialValue: V) : ReadWriteProperty<Any?, V> {private var value = initialValueprotected open fun beforeChange(property: KProperty<*>, oldValue: V, newValue: V): Boolean = trueprotected open fun afterChange(property: KProperty<*>, oldValue: V, newValue: V): Unit {}public override fun getValue(thisRef: Any?, property: KProperty<*>): V {return value}public override fun setValue(thisRef: Any?, property: KProperty<*>, value: V) {val oldValue = this.valueif (!beforeChange(property, oldValue, value)) {return}this.value = valueafterChange(property, oldValue, value)}override fun toString(): String = "ObservableProperty(value=$value)"
}

beforeChange在属性值被变更前被调用,默认返回true,就是说即使你写出这样的代码:

import kotlin.properties.Delegatesvar name: String by Delegates.observable("init") { property, oldValue, newValue ->println("${property.name} changed from $oldValue to $newValue")
}fun main() {name = "init"name = "Bob"
}

也会输出结果:

name changed from init to init
name changed from init to Bob

ObservableProperty内部维护了属性值,并在 setValue 方法中触发回调,这个回调的实现就是我们传入的lambda参数onChange

每次我们通过赋值等操作修改被委托的属性时,都会触发 setValue() 方法,从而调用 onChange 回调。

总结:工作机制

  1. Delegates.observable(initialValue, onChange) 返回 ObservableProperty 实例
  2. ObservableProperty 实现了 ReadWriteProperty 接口
  3. Kotlin 编译器在 by 后会将属性访问转发给 getValue()setValue()
  4. setValue() 中自动触发 onChange() 回调

使用场景

  • 数据绑定(如 UI)
  • 表单输入监听
  • MVVM 架构中 ViewModel 属性监听
  • 日志审计、调试属性变化等
http://www.xdnf.cn/news/15683.html

相关文章:

  • 快慢指针的应用
  • CPP学习之list使用及模拟实现
  • Java程序设计学习笔记
  • 玖[9],相机/镜头/光源
  • Spring Boot 监控:AOP vs Filter vs Java Agent
  • Cadence SPB 2024软件下载及安装教程|Cadence软件安装详细步骤附下载链接
  • java如何实现打印list对象占用多大内存
  • Web开发 01
  • 【Java开发日记】详细地讲解一下如何保证线程安全性呢?
  • vue svg实现一个环形进度条组件
  • VSCODE常规设置
  • 代码随想录算法训练营65期第22天
  • 【专题十二】栈
  • 从现场出发:能源系统中的智能设备与实际落地工具解读
  • 【Java开发日记】我们来说说 LockSupport 的 park 和 unpark
  • docker--安装--原理
  • RabbitMQ概述和工作模式
  • 60个功能OfficeBox 万彩办公大师:PDF 格式转换 OCR识别免费无广告
  • mac电脑无法阅读runc源码
  • Docker容器技术讲解
  • Apache SeaTunnel详解与部署(最新版本2.3.11)
  • ether.js的calldata
  • 【基于飞浆训练车牌识别模型】
  • 【Java】【力扣】101.对称二叉树
  • Transform的重要方法
  • C++修炼:IO流
  • 关于程序=数据结构+算法这句话最近的一些思考
  • 多目标优化|HKELM混合核极限学习机+NSGAII算法工艺参数优化、工程设计优化,四目标(最大化输出y1、最小化输出y2,y3,y4),Matlab完整源码
  • WAMP允许远程访问
  • 【机器学习【6】】数据理解:数据导入、数据审查与数据可视化方法论