Kotlin 委托

Kotlin 委托

委托模式 是一种 通过 对象组合 实现代码重用 的设计模式,

对象处理请求时 将其 委托给 其他对象(委托)处理。

Kotlin 委托 分为:

  1. 类的委托
  2. 属性的委托

一、类的委托

委托 Delegate 是实现继承的一种替代方式。达到了 多继承、代码复用 目的。

我们知道Java本身不支持多继承的,而是通过 接口 实现多态。

接口每次都要实现,对于已有的代码实现 复用,可通过 委托实现类

通过 by 关键字, 来委托接口实现。

举例,Base 接口 委托实现:

interface Base {fun print()
}class BaseImpl(val x: Int) : Base {override fun print() { print(x) }
}// 通过 构造器 参数 委托
class Derived(b: Base) : Base by b
// 也可以 实例对象 委托
class Derived : Base by BaseImpl(10)

二、属性委托(Property delegate)

属性委托,通过 委托类 实现

  • operator fun getValue(thisRef, property)
  • operator fun setValue(thisRef, property, value)

方法 实现 委托属性的读写。

下面代码,实现属性委托:

class Delegate(private var str: String) {operator fun getValue(ref: Any?, property: KProperty<*>): String {// 返回 属性值return str}operator fun setValue(ref: Any?, property: KProperty<*>, value: String) {// 进行赋值this.str = value}}class Owner {// 通过委托val p: String by Delegate()
}

方便 属性委托 实现,Kotlin标准库提供:

  • ReadOnlyProperty,对应 val 只读属性
  • ReadWriteProperty,对应 var 读写属性

属性的委托接口(可手写不使用此接口,仅为了方便)。

public interface ReadWriteProperty<in T, V> : ReadOnlyProperty<T, V> {public override operator fun getValue(thisRef: T, property: KProperty<*>): Vpublic operator fun setValue(thisRef: T, property: KProperty<*>, value: V)}

标准委托

Kotlin 有以下 委托 方法:

  1. 延迟属性 lazy
  2. 可观察属性 Delegates.observable 和 Delegates.vetoable
  3. 委托给其他属性
  4. Map属性
1. 延迟属性(Lazy properties)

延迟初始化,只有第一次调用时 执行 lazy{},后面直接返回 存储的值。

// 延迟属性
val countData by lazy {MutableLiveData(0)
}
2. 可观察属性

每次属性赋值时,都会调用 handler 方法。

vetoableobservable 一样也是 赋值 时,调用 handler 方法。
但是 vetoable 是在 赋值前 调用,通过返回 true false 确定是否 赋值。

// 可观察属性,
val count by Delegates.observable(0) { _, old, new -> println("print value, old: ${old}, new: ${new}")
}
// 是否设置新值 的 可观察属性
val count by Delegates.vetoable(0) { _, old, new -> // 返回false,不更新值false
}

补充:

Delegates 还有 notNull<T>() 方法,创建一个非空的委托,不会在初始化赋值,
而是在后面进行初始值。在设置初始化值前,访问抛出IllegalStateException异常。

3. 委托给其他属性

将属性 委托 给其他属性 或 其他对象的属性。使用 :: 操作符来 引用 其他属性。

class MyClass {var newName: Int = 0@Deprecated("Use 'newName' instead", ReplaceWith("newName"))var oldName: Int by this::newName
}
4. Map委托

通用的场景把 属性值 存储在 map 中。

// Map,取 以 属性名 为 键的 值
class User(val map: Map<String, Any?>) {val name: String by mapval age: Int     by map
}// 如果希望可修改,使用 MutableMap
class User(val map: MutableMap<String, Any?>) {var name: String by mapvar age: Int     by map
}

文档

  • Delegation
  • Delegated properties
  • kotlincn委托
  • Delegation pattern | Wiki

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

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

相关文章

流量预测中文文献阅读(郭郭专用)

目录 基于流量预测的超密集网络资源分配策略研究_2023_高雪亮_内蒙古大学&#xff08;1&#xff09;内容总结&#xff08;2&#xff09;流量预测部分1、数据集2、结果对其中的一个网格的CDR进行预测RMSE和R2近邻数据和周期数据对RMSE的影响 &#xff08;3&#xff09;基于流量预…

ElasticSearch概述+SpringBoot 集成 ES

ES概述 开源的、高扩展的、分布式全文检索引擎【站内搜索】 解决问题 1.搜索词是一个整体时&#xff0c;不能拆分&#xff08;mysql整体连续&#xff09; 2.效率会低&#xff0c;不会用到索引&#xff08;mysql索引失效&#xff09; 解决方式 进行数据的存储&#xff08;只存储…

无缝打通易快报与电子签章系统,合同管理也能如此简单!

客户介绍&#xff1a; 某股份有限公司是一家专注于高端装备制造和智能制造解决方案的高新技术企业。该公司的产品和服务广泛应用于汽车、航空、高铁、智能家居、电子电器、新能源等领域&#xff0c;为全球客户提供了高效、精准、可靠的制造解决方案。 添加图片注释&#xff0c…

剑指offer面试题4 替换空格

考察点 考察数据结构字符串知识点 不同于c语言&#xff0c;java语言有字符和字符串俩种数据类型&#xff0c;char类型(字符类型)是基本数据类型&#xff0c;string类型(字符串类型)是引用类型 java语言中的字符采用unicode编码在内存中用2个字节存储&#xff0c;因此一个英文…

js中console.log()的使用方法

console.log()是JavaScript中的一个内置函数&#xff0c;用于在控制台输出信息&#xff1b;该方法对于开发过程进行测试很有帮助。可以输出之前在其中定义的任何类型的变量&#xff0c;或者只输出需要显示给用户的任何消息。 语法是&#xff1a; console。log&#xff08;&am…

HCIA-Datacom题库(自己整理分类的)_12_其他网络协议多选【12道题】

1.下面哪些是路由协议? BGP IPX OSPF IP 2.网络管理员使用Ping来测试网络的连通性&#xff0c;在这个过程中下面哪个协议可能会被使用到? UDP ICMP ARP TCP 解析&#xff1a;UDP、TCP是四层协议。 3.以下哪些是指网络通信? 使用即时通信软件(如:QQ、微信)与好友…

​iOS 应用上架指南:资料填写及提交审核

目录 摘要 引言 打开appuploader工具&#xff0c;第二步&#xff1a;打开appuploader工具 第五步&#xff1a;交付应用程序&#xff0c;在iTunes Connect中查看应用程序 总结 摘要 本文提供了iOS新站上架资料填写及提交审核的详细指南&#xff0c;包括创建应用、资料填写-…

【JAVA语言-第12话】API中的工具类 之 Date,DateFormat,SimpleDateFormat,Calendar类的详细解析

目录 日期和时间 1.1 Date类 1.1.1 概述 1.1.2 常用方法 1.1.3 案例 1.2 DateFormat类 1.2.1 概述 1.2.2 常用方法 1.3 SimpleDateFormat类 1.3.1 概述 1.3.2 构造方法 1.3.3 模式字符 1.3.4 日期转字符串 1.3.5 字符串转日期 1.4 Calendar类 1.4.1 概述 1…

软件工程宠物管理系统详细计划示例

1&#xff0e;引言 1.1编写目的 本详细设计说明书旨在为宠物管理系统的开发提供一个清晰、全面的指导&#xff0c;确保项目顺利进行。本说明书详细阐述了系统的功能、架构、模块划分以及技术选型等方面的内容&#xff0c;旨在为项目开发团队、项目管理人员和感兴趣的读者提供…

Raspbian安装摄像头

Raspbian安装摄像头 1. 源由2. 摄像头2.1 选型2.2 系统2.3 安装 3. 配置&命令3.1 命令3.2 配置 4. 测试4.1 拍照4.1.1 libcamera-jpeg4.1.2 libcamera-still 4.2 视频流4.2.1 RTSP流4.2.2 TCP流 5. 参考资料 1. 源由 家里闲置两块树莓派&#xff0c;打算做个WiFi视频流RTS…

python - fastapi 之 Denpends

Depends 描述 在 FastAPI 中&#xff0c;Depends 是一个用于处理依赖关系的工具。 Depends允许开发者定义一个可复用函数&#xff0c;此函数作为参数传递给路由处理函数。 from fastapi import Dependsuser_router.post("/test") def test_api(data: UserTestSche…

【JaveWeb教程】(21) MySQL数据库开发之多表设计:一对多、一对一、多对多的表关系 详细代码示例讲解

目录 2. 多表设计2.1 一对多2.1.1 表设计2.1.2 外键约束 2.2 一对一2.3 多对多2.4 案例 2. 多表设计 关于单表的操作(单表的设计、单表的增删改查)我们就已经学习完了。接下来我们就要来学习多表的操作&#xff0c;首先来学习多表的设计。 项目开发中&#xff0c;在进行数据库…

Csiszár divergences

Csiszr divergences 熵函数 熵函数&#xff08;entropy function) φ : R → R \varphi: \mathbb{R}_{} \to \mathbb{R}_{} φ:R​→R​&#xff0c;他是凸函数&#xff0c;正的&#xff08;&#xff1f;&#xff09;&#xff0c;下半连续函数&#xff0c;并且 φ ( 1 ) …

【算法题】45. 跳跃游戏 II

题目 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说&#xff0c;如果你在 nums[i] 处&#xff0c;你可以跳转到任意 nums[i j] 处: 0 < j < nums[i] i j < n 返回到达 nums[n - …

MISGAN

MISGAN:通过生成对抗网络从不完整数据中学习 代码、论文、会议发表: ICLR 2019 摘要: 生成对抗网络(GAN)已被证明提供了一种对复杂分布进行建模的有效方法,并在各种具有挑战性的任务上取得了令人印象深刻的结果。然而,典型的 GAN 需要在训练期间充分观察数据。在本文中…

VSCODE插件开发API

vscode插件开发功能很强大&#xff0c;但是网上的资料很少&#xff0c;整理下自己使用的插件接口。 安装 npm install -g yo generator-code yo codetips: 提示’yo’ 不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件。 需要新增node的环境变量&#xff1a;C:…

matlab中any()函数用法

一、帮助文档中的介绍 B any(A) 沿着大小不等于 1 的数组 A 的第一维测试所有元素为非零数字还是逻辑值 1 (true)。实际上&#xff0c;any 是逻辑 OR 运算符的原生扩展。 二、解读 分两步走&#xff1a; ①确定维度&#xff1b;②确定运算规则 以下面二维数组为例 >>…

FEB(acwing)

文章目录 FEB题目描述输入格式输出格式数据范围输入样例1&#xff1a;输出样例1&#xff1a;输入样例2&#xff1a;输出样例2&#xff1a;输入样例3&#xff1a;输出样例3&#xff1a;代码题解情况1&#xff1a;xxxxxx&#xff1a;0&#xff0c;1&#xff0c;2&#xff0c;…&a…

Java获取文件的后缀名称

String fileName "example.txt";String fileExtension fileName.substring(fileName.lastIndexOf(".") 1); 使用lastIndexOf()方法&#xff0c;找到文件名中最后一个点的位置&#xff0c; 然后使用substring()方法&#xff0c;获取点后面的字符串作为文…

AI教我学编程之C#变量及实例演示

前言 在AI教我学编程之AI自刀 这篇文章中&#xff0c;我们知道了变量的基础类型&#xff0c;那么变量在C#中有什么作用呢&#xff1f;我们一起来看看吧&#xff01; 目录 重点先知 变量 变量类型 实例演示 变量声明 实例演示 提出疑问 初始化变量 自动初始化 多变量声明 实…