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

【记】如何理解kotlin中的委托属性?

1. 什么是委托属性?

委托属性的核心思想是:

  • 你可以将一个属性的 getter 和 setter 的逻辑交给一个外部对象(称为委托对象)来处理。
  • 这个外部对象负责存储属性的值,并提供自定义的 get 和 set 行为。

通过委托属性,你可以:

  1. 简化代码,避免重复。
  2. 实现属性的懒加载(Lazy Properties)。
  3. 监听属性的变化(Observable Properties)。
  4. 将属性的存储和逻辑分离。

2. 委托属性的基本语法

在 Kotlin 中,委托属性的语法如下:

class MyClass {
    var property: Type by Delegate
}
  • by:用于将属性的 getter 和 setter 委托给一个外部对象(Delegate)。
  • Delegate:一个实现了 getProperty 和 setProperty 方法的对象,负责处理属性的存储和逻辑。

3. 委托属性的示例

例 1:简单的委托属性

假设我们有一个 Delegate 类,它实现了 getPropertysetProperty 方法:

class SimpleDelegate {
    private var value: Int = 0

    operator fun getValue(thisRef: Any?, property: KProperty<*>): Int {
        return value
    }

    operator fun setValue(thisRef: Any?, property: KProperty<*>, value: Int) {
        this.value = value
    }
}
  • getValue:用于获取属性的值。
  • setValue:用于设置属性的值。

然后,我们可以在类中使用这个委托:

class MyClass {
    var number: Int by SimpleDelegate()
}
  • number:这个属性的 getter 和 setter 被委托给 SimpleDelegate

使用效果:

val obj = MyClass()
println(obj.number) // 调用 SimpleDelegate 的 getValue
obj.number = 42 // 调用 SimpleDelegate 的 setValue
println(obj.number) // 输出: 42

例 2:懒加载属性(Lazy Properties)

Kotlin 标准库提供了 lazy 委托,用于实现懒加载属性。懒加载属性的值在第一次访问时才会被初始化。

class MyClass {
    val lazyValue: String by lazy {
        println("Initializing lazyValue")
        "Hello, Lazy!"
    }
}
  • lazy:一个标准库提供的委托,用于实现懒加载。
  • 初始化逻辑:在第一次访问 lazyValue 时,才会执行初始化逻辑。

使用效果:

val obj = MyClass()
println(obj.lazyValue) // 输出: Initializing lazyValue \n Hello, Lazy!

例 3:可观察属性(Observable Properties)

Kotlin 标准库还提供了 observable 委托,用于监听属性的变化。

import kotlin.properties.Delegates

class MyClass {
    var observableValue: String by Delegates.observable("<initial>") {
        _, old, new ->
        println("Property changed from $old to $new")
    }
}
  • Delegates.observable:一个标准库提供的委托,用于监听属性的变化。
  • 回调函数:在属性值改变时,会调用回调函数。

使用效果:

val obj = MyClass()
obj.observableValue = "New Value" // 输出: Property changed from <initial> to New Value

 4. 委托属性的优势

  • 简化代码:通过委托,实现属性的存储和逻辑分离,避免重复代码。
  • 懒加载:通过 lazy 委托,可以实现属性的懒加载。
  • 监听变化:通过 observable 委托,可以监听属性的变化。
  • 灵活性:可以自定义委托对象,实现更复杂的行为。

5. 总结

  • 委托属性:通过 by 关键字,将属性的 getter 和 setter 委托给一个外部对象。
  • 委托对象:负责存储属性的值,并提供自定义的 get 和 set 行为。
  • 常见用途
    • 懒加载属性(lazy)。
    • 可观察属性(observable)。
    • 自定义委托(如 SimpleDelegate)。

相关文章:

  • Python的基本知识
  • MySQL学习笔记
  • LSTA: Long Short-Term Attention for Egocentric Action Recognition
  • 【人工智能】【Python】在Scikit-Learn中使用决策树算法(ID3和CART)
  • manim安装
  • 不同路径——1
  • LeetCodeHot100_0x07
  • 2025高频面试算法总结篇【递归回溯动态规划】
  • LabVIEW 线性拟合
  • Python核心语法-数据基本运算(一)
  • 笔记:代码随想录算法训练营day46:LeetCode647. 回文子串\516.最长回文子序列
  • JVM---Java 类生命周期与类加载机制
  • 高版本node(17+)环境下VUE2项目启动报错
  • 失败的面试经历(ʘ̥∧ʘ̥)
  • 从过拟合到强化学习:机器学习核心知识全解析
  • 关于playwright的data-testid
  • 深入探索Android Bitmap:从原理到实战
  • 【人工智能基础2】人工神经网络、卷积神经网络基础、循环神经网络、长短时记忆网络
  • 【排序】快速排序
  • Python —— random.choice()的用法
  • 上海迪士尼蜘蛛侠主题园区正式动工,毗邻“疯狂动物城”
  • 倒计时1天:走进“中国荔乡”茂名,探寻农交文旅商融合发展新模式
  • 上昆“学馆制”10年,完成300出折子戏和20台大戏传承
  • 芬兰直升机相撞坠毁事故中五名人员全部遇难
  • “80后”萍乡市安源区区长邱伟,拟任县(区)委书记
  • 秦洪看盘|风格有所转变,热钱回流高弹性品种