在 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()) // 第二次直接返回缓存
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/82350.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI星智协脑:智能驱动的高效协作管理平台全解读

前言 想象一下&#xff1a;早上刚开电脑&#xff0c;十几条未读消息如机关枪般扫射而来&#xff0c;各路任务像陨石雨一样砸向你&#xff0c;会议排得比热播剧还密集&#xff0c;文档版本堪比宫斗剧剧情反转&#xff0c;同事围着你转圈追KPI&#xff0c;活脱脱一场《职场大逃杀…

Web 架构之数据读写分离

文章目录 一、引言二、数据读写分离原理2.1 基本概念2.2 工作流程 三、数据读写分离的实现方式3.1 基于中间件实现3.2 应用程序层面实现 四、常见问题及解决方法4.1 数据一致性问题4.2 从数据库负载均衡问题4.3 主从复制故障问题 五、思维导图六、总结 一、引言 在 Web应用的开…

【软件设计师:数据结构】1.数据结构基础(一)

一 线性表 1.线性表定义 线性表是n个元素的有限序列,通常记为(a1,a2,…,an)。 特点: 存在惟一的表头和表尾。除了表头外,表中的每一个元素均只有惟一的直接前驱。除了表尾外,表中的每一个元素均只有惟一的直接后继。2.线性表的存储结构 (1)顺序存储 是用一组地址连续…

实践005-Gitlab CICD全项目整合

文章目录 环境准备环境准备集成Kubernetes Gitlab CICD项目整合项目整合整合设计 后端Java项目部署后端Java项目静态检查后端Java项目镜像构建创建Java项目部署文件创建完整流水线 前端webui项目部署前端webui项目镜像构建创建webui项目部署文件创建完整流水线 构建父子类型流水…

鸿蒙开发:dialog库做了一些优化

前言 本文基于Api13 dialog库是我去年5月份开发了一个便捷弹窗库&#xff0c;主打一个使用简单&#xff0c;一经推出&#xff0c;在dialog领域下载量稳居在前&#xff0c;可以说是非常受欢迎的&#xff1b;但是&#xff0c;之前的版本仍然有着可优化的空间&#xff0c;比如弹窗…

Windows 10 无法启动或黑屏的修复指南(适用于更新失败或磁盘故障)

Windows 10 无法启动或黑屏的修复指南&#xff08;适用于更新失败或磁盘故障&#xff09; 当 Windows 10 突然无法启动&#xff08;黑屏、无限重启、更新失败后断电等情况&#xff09;&#xff0c;很可能是由于启动引导程序损坏或系统映像异常&#xff08;如系统磁盘出现坏道&…

MCP开发入门

MCP开发入门 官方文档: https://modelcontextprotocol.io/introduction 入门教程: https://github.com/liaokongVFX/MCP-Chinese-Getting-Started-Guide 本文源代码&#xff1a;https://github.com/youngqqcn/mcp-server-demo 什么是MCP&#xff1f; 模型上下文协议&#xff…

PX4开始之旅(二)通过自定义 MAVLink 消息与 QGroundControl (QGC) 通信

核心知识点&#xff1a;通过自定义 MAVLink 消息与 QGroundControl (QGC) 通信 1. 通俗易懂的解释 想象一下&#xff0c;MAVLink 就像是无人机&#xff08;飞控&#xff09;和地面站&#xff08;QGroundControl&#xff09;之间约定好的一种“语言”。这种语言有很多标准的“…

AI视频智能分析网关打造社区/工厂/校园/仓库智慧消防实现精准化安全管控

一、背景 随着社区、商业场所对消防安全要求日益提升&#xff0c;传统消防系统已难以满足智能化、精细化管理需求。智能分析网关融合物联网与人工智能技术&#xff0c;具备强大的数据处理与分析能力&#xff0c;可全面升级消防系统。将其融入消防系统各层级&#xff0c;搭建智…

深度学习基础--目标检测常见算法简介(R-CNN、Fast R-CNN、Faster R-CNN、Mask R-CNN、SSD、YOLO)

博主简介&#xff1a;努力学习的22级本科生一枚 &#x1f31f;​&#xff1b;探索AI算法&#xff0c;C&#xff0c;go语言的世界&#xff1b;在迷茫中寻找光芒​&#x1f338;​ 博客主页&#xff1a;羊小猪~~-CSDN博客 内容简介&#xff1a;常见目标检测算法简介​&#x1f…

传输层协议UDP和TCP

传输层协议UDP和TCP 1、UDP2、TCP2.1、TCP协议段格式2.2、确认应答(ACK)机制2.3、超时重传机制2.4、连接管理机制2.5、理解CLOSE_WAIT状态2.6、理解TIME_WAIT状态2.7、流量控制2.8、滑动窗口2.9、拥塞控制2.10、延迟应答2.11、捎带应答2.12、面向字节流2.13、粘包问题2.14、TCP…

PMIC电源管理模块的PCB设计

目录 PMU模块简介 PMU的PCB设计 PMU模块简介 PMIC&#xff08;电源管理集成电路&#xff09;是现代电子设备的核心模块&#xff0c;负责高效协调多路电源的转换、分配与监控。它通过集成DC-DC降压/升压、LDO线性稳压、电池充电管理、功耗状态切换等功能&#xff0c;替代传统分…

Ubuntu 配置网络接口端点(静态 IP 地址)详细教程

在 Ubuntu 系统中&#xff0c;配置网络接口端点通常指的是为您的有线或无线网卡设置一个固定的 IP 地址、子网掩码、网关以及 DNS 服务器。这对于服务器或者需要稳定网络标识的设备来说非常重要。 使用 Netplan (Ubuntu 17.10 及更高版本的默认方式)使用 ifupdown (通过 /etc/…

浅聊大模型-有条件的文本生成

大家好我是木木&#xff0c;自从2022年11月30日OpenAI发布ChatGPT后&#xff0c;大模型迅速火热起来&#xff0c;人工智能作为当下最火的行业之一&#xff0c;2025年春节期间DeepSeek R1模型大火。LLM中有很多的技术&#xff0c;今天我们聊聊大模型-有条件的文本生成。 什么是…

华为银河麒麟 V10(ARM)系统软件部署全攻略:Redis、RabbitMQ、MySQL 等集群搭建指南

一、Redis 集群部署&#xff08;主从 哨兵模式&#xff09; 1. 环境准备 系统&#xff1a;华为银河麒麟 V10&#xff08;ARM64&#xff09;节点&#xff1a;3 台服务器&#xff08;1 主 2 从 3 哨兵&#xff09; 2. 安装包下载 bash # 华为镜像站 wget https://update.c…

Mysql数据库进阶

一、Mysql组织架构 连接层 1.验证用户的身份,用户名密码是否匹配 2.提供两种连接方式(TCP/IP连接、socket连接) 3.连接层提供了一个与sql层交互的线程 SQL层 1.接收连接层传过来的SQL语句 2.验证执行的SQL语法 3.验证SQL的语义(DDL,DML,DQL,DCL) 4.解析器:解析SQL语句,生…

系统思考:短期困境与长期收益

最近在项目中&#xff0c;一直有学员会提到一个议题&#xff0c;如何平衡当前困境和长期收益&#xff1f; 我的思考是在商业和人生的路上&#xff0c;我们常常听到“鱼和熊掌不可兼得”的说法&#xff0c;似乎短期利益和长期目标注定是对立的。但事实上&#xff0c;鱼与熊掌是…

Spring Web MVC快速入门

什么是Spring Web MVC Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架&#xff0c;从⼀开始就包含在 Spring 框架中。它的正式名称“Spring Web MVC”来⾃其源模块的名称(Spring-webmvc)&#xff0c;但它通常被称为"Spring MVC". View(视图) 指在应⽤程序…

DeepSeek基于注意力模型的可控图像生成

DeepSeek大模型高性能核心技术与多模态融合开发 - 商品搜索 - 京东 图像的加噪与模型训练 在扩散模型的训练过程中&#xff0c;首先需要对输入的信号进行加噪处理&#xff0c;经典的加噪过程是在图像进行向量化处理后在其中添加正态分布&#xff0c;而正态分布的值也是与时间…

第十六届蓝桥杯B组第二题

当时在考场的时候这一道题目 无论我是使用JAVA的大数&#xff08;BIGTHGER&#xff09;还是赛后 使用PY 都是没有运行出来 今天也是突发奇想在B站上面搜一搜 看了才知道这也是需要一定的数学思维 通过转换 设X来把运算式精简化 避免运行超时 下面则是代码 public class lanba…