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

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

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

1 属性委托

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

语法:

var/val 属性名: 类型 by 委托对象

委托类的要求:

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

常见的使用场景:

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

示例:

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 类委托

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

语法:

class 类名(委托对象): 接口 by 委托对象

典型场景:

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

示例:

interface DataFetcher {fun fetchData(): String
}class NetworkFetcher : DataFetcher {override fun fetchData() = "从网络获取数据"
}// 通过委托添加缓存功能
class CachedFetcher(private val fetcher: DataFetcher) : DataFetcher by fetcher {private var cachedData: String? = nulloverride 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()) // 第二次直接返回缓存
}

相关文章:

  • window 显示驱动开发-线性内存空间段
  • kotlin 数据类
  • 2025 年数维杯数学建模 C 题完整论文代码模型:清明时节雨纷纷,何处踏青不误春
  • 最新CDGP单选题(第一章)补充
  • C# 的异步任务中, 如何暂停, 继续,停止任务
  • AKS 支持 Kata Container容器沙盒 -预览阶段
  • 什么是AI写作
  • [QMT量化交易小白入门]-五十一、用Backtrader搭建双均线策略回测平台,年化收益13%
  • Nginx静态资源增加权限验证
  • 计算机二级(C语言)已过
  • Rust 中的 `String`、`str` 和 `str`:深入解析与使用指南
  • Java设计模式之工厂方法模式:从入门到精通
  • 高效管理钉钉收款单数据集成到MySQL的技术方案
  • C——数组和函数实践:扫雷
  • Flutter 3.29.3 花屏问题记录
  • 机器学习第二讲:对比传统编程:解决复杂规则场景
  • CurrentHashMap的整体系统介绍及Java内存模型(JVM)介绍
  • AI Agent(7):Agent规划与决策能力
  • 等保系列(三):等保测评的那些事
  • 【Spring AI 实战】基于 Docker Model Runner 构建本地化 AI 聊天服务:从配置到函数调用全解析
  • 4月证券私募产品备案量创23个月新高,股票策略占比超六成
  • 沃旭能源因成本上升放弃英国海上风电项目,或损失近40亿元
  • 4月金融数据前瞻:受去年低基数因素影响,社融增量有望同比大幅多增
  • 悬疑推理联合书单|虫神山事件
  • 代理销售保险存在误导行为,农业银行重庆市分行相关负责人被罚款0.1万元
  • 丹麦召见美外交官,强调“不能容忍”美在格陵兰岛间谍活动