在 Kotlin 中什么是委托属性,简要说说其使用场景和原理

在 Kotlin 中,属性委托和类委托是两种通过 by 关键字实现的强大特性,它们通过"委托"机制将行为或实现逻辑委托给其他对象,从而实现代码的复用和解耦。

1 属性委托

定义: 允许把属性的 get 和 set 方法的具体实现委托给另一个对象。

语法:

kotlin 复制代码
var/val 属性名: 类型 by 委托对象

委托类的要求:

  • 对于 val(只读属性),需要实现 getValue();
  • 对于 var(可变属性),需要实现 getValue() 和 setValue()

常见的使用场景:

  • 延迟初始化:by lazy(首次访问时才进行初始化);
  • 属性监听:Delegates.observable(属性值发生变化时触发回调);
  • 动态属性存储:从 Map 中读取属性(如解析 JSON 或配置);

示例:

kotlin 复制代码
class Person(val name: String, val age: Int)

val person: Person by lazy {
    Person("Eileen", 34)
}


var name: String by Delegates.observable("init data") { prop, old, new ->
    println("${prop.name} 从 $old 变为 $new")
}


class Student(val map: Map<String, Any>) {
    val name: String by map // 从 map 中按 key 取值
    val age: Int by map
}

val student = Student(mapOf("name" to "Eileen", "age" to 30))
println(student.name) // Eileen

Kotlin 标准库提供的委托工具:

  • lazy:延迟初始化;
  • Delegates.observable:监听属性变化;
  • Delegates.vetoable:在赋值前校验值是否合法;
  • Delegates.notNull:非空属性的延迟赋值;

2 类委托

定义:将类的接口实现委托给另一个对象,实现组合复用。 通过组合代替继承,避免单继承的局限性。

语法:

kotlin 复制代码
class 类名(委托对象): 接口 by 委托对象

典型场景:

  • 装饰器模式:增强对现有对象的功能(如添加日志、缓存);
  • 接口实现复用:多个类共享同一接口的默认逻辑;
  • 动态替换行为:运行时切换委托对象(如策略模式);

示例:

kotlin 复制代码
interface DataFetcher {
    fun fetchData(): String
}

class NetworkFetcher : DataFetcher {
    override fun fetchData() = "从网络获取数据"
}

// 通过委托添加缓存功能
class CachedFetcher(private val fetcher: DataFetcher) : DataFetcher by fetcher {
    private var cachedData: String? = null

    override fun fetchData(): String {
        return cachedData ?: fetcher.fetchData().also { cachedData = it }
    }
}

fun main() {
    val networkFetcher = NetworkFetcher()
    val cachedFetcher = CachedFetcher(networkFetcher)
    println(cachedFetcher.fetchData()) // 第一次调用从网络获取
    println(cachedFetcher.fetchData()) // 第二次直接返回缓存
}
相关推荐
小羊没烦恼!4 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
千里马学框架4 天前
一起学 Android 14:ShellTransition 屏幕旋转过程深度剖析
android·智能手机·性能优化·framework·性能·屏幕旋转·rotation
美狐美颜SDK开放平台4 天前
开发直播APP时如何接入视频美颜SDK?开发流程与注意事项
android·人工智能·计算机视觉·音视频·直播美颜sdk
AFinalStone4 天前
Android7 SystemUI源码解析(七)Keyguard锁屏模块深度解析
android·systemui
伞伞悦读4 天前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
致远ccc4 天前
Google Play 上架前如何测试 App?多国家 Android 环境测试
android·app测试·googleplay·多国家应用测试
C语言小火车4 天前
C/C++ 为什么需要编译器?
开发语言·c++
霍霍的袁4 天前
【C++】map 和 set 的使用 | 从用法到底层
开发语言·c++·学习·visual studio
ttyyttemo4 天前
Kotlin 协程中的 Job 结构化并发与取消
android
孙启超4 天前
【AI开发之Rust】第 11 课:智能指针与内部可变性
开发语言·后端·rust