(Kotlin高级特性四)kotlin属性委托(如 by lazy) 的原理?
Kotlin 的属性委托是一种非常强大的特性,它通过
by
关键字将属性的 Getter/Setter 访问逻辑‘委托’给另一个类来管理。这实现了属性的延迟初始化、观察者模式等功能的完美封装。其核心原理在于编译器的语法糖和约定操作。”
第一部分:属性委托的核心原理
属性委托的本质是:编译器将属性的 Getter 和 Setter 方法调用,转发给一个“委托对象”的特定方法。
1. 底层约定
对于任何一个被委托的属性 val/var p: T by Delegate()
,编译器会遵循以下约定:
-
对于
val
(只读属性),编译器会要求委托对象提供一个名为getValue
的操作符函数。kotlin
// 你写的代码 val name: String by Delegate()// 编译器生成的近似代码 private val name$delegate = Delegate() val name: Stringget() = name$delegate.getValue(this, ::name)// `this` 是属性所在类的引用// `::name` 是属性的 KProperty 反射对象
-
对于
var
(可变属性),编译器会要求委托对象额外提供一个名为setValue
的操作符函数。kotlin
// 你写的代码 var name: String by Delegate()// 编译器生成的近似代码 private val name$delegate = Delegate() var name: Stringget() = name$delegate.getValue(this, ::name)set(value) { name$delegate.setValue(this, ::name, value) }
2. 函数签名约定
委托类中的 getValue
和