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

Kotlin中的委托

在Kotlin中,委托是一种强大的设计模式,它允许一个类将其一些职责委托给另一个类。这种机制通过关键字by来实现。委托有助于代码的重用,降低耦合性,并提供更清晰的类设计。在Kotlin中,有两种主要类型的委托:类委托和属性委托。

类委托(Class Delegation)

类委托允许一个类将部分或全部实现委托给另一个辅助类。委托类和被委托类之间建立了一种代理关系,被委托类的方法可以由委托类的实例来实现。

interface Printer {fun printMessage(message: String)
}class DefaultPrinter : Printer {override fun printMessage(message: String) {println("Default: $message")}
}class CustomPrinter(delegate: Printer) : Printer by delegatefun main() {val defaultPrinter = DefaultPrinter()val customPrinter = CustomPrinter(defaultPrinter)customPrinter.printMessage("Hello, Kotlin!")
}

在上面的例子中,CustomPrinter通过by关键字将其printMessage方法的实现委托给了DefaultPrinter。当调用customPrinter.printMessage时,实际上是调用了DefaultPrinter的printMessage方法。

属性委托(Property Delegation)

属性委托允许类将属性的 get 和 set 操作委托给另一个类。Kotlin标准库提供了一些内置的属性委托,比如 lazy、observable 等。

import kotlin.properties.Delegatesclass User {var name: String by Delegates.observable("DefaultName") { _, old, new ->println("Name changed from $old to $new")}
}fun main() {val user = User()println(user.name) // 输出: DefaultNameuser.name = "NewName" // 输出: Name changed from DefaultName to NewNameprintln(user.name) // 输出: NewName
}

在上面的例子中,User类的name属性通过Delegates.observable委托给了一个观察者,每当属性发生变化时,观察者会被调用。

此外,Kotlin还提供了 lazy 委托,它允许属性的初始化推迟到第一次访问时,以及 vetoable 委托,它允许在属性值被修改之前进行验证。

自定义属性委托

除了使用标准库提供的属性委托,还可以自定义属性委托来满足特定的需求。一个自定义属性委托需要实现 ReadWriteProperty 接口,该接口包含 getValue 和 setValue 方法。

import kotlin.properties.ReadWriteProperty
import kotlin.reflect.KPropertyclass CustomDelegate : ReadWriteProperty<Any?, String> {private var storedValue: String = ""override fun getValue(thisRef: Any?, property: KProperty<*>): String {println("Getting value: $storedValue")return storedValue}override fun setValue(thisRef: Any?, property: KProperty<*>, value: String) {println("Setting value: $value")storedValue = value}
}class Example {var customProperty: String by CustomDelegate()
}fun main() {val example = Example()example.customProperty = "Hello, Kotlin!" // 输出: Setting value: Hello, Kotlin!println(example.customProperty) // 输出: Getting value: Hello, Kotlin!
}

在这个例子中,CustomDelegate 实现了 ReadWriteProperty 接口,它用于管理一个属性的读和写。Example 类中的 customProperty 属性使用了自定义委托,实际的读写操作会被 CustomDelegate 处理。

委托属性的要求:
getValue和setValue方法:实现 ReadWriteProperty 接口需要提供 getValue 和 setValue 方法,它们负责属性的读和写。

KProperty参数:getValue 和 setValue 方法的最后一个参数是 KProperty 类型的参数,用于描述属性的元信息。

线程安全性:在多线程环境中使用委托时,需要确保委托的实现是线程安全的。

通过自定义属性委托,可以实现更复杂、更灵活的属性行为,从而使代码更易于理解和维护。

相关文章:

Kotlin中的委托

在Kotlin中&#xff0c;委托是一种强大的设计模式&#xff0c;它允许一个类将其一些职责委托给另一个类。这种机制通过关键字by来实现。委托有助于代码的重用&#xff0c;降低耦合性&#xff0c;并提供更清晰的类设计。在Kotlin中&#xff0c;有两种主要类型的委托&#xff1a;…...

VUE2/3:element ui table表格的显隐列(若依框架)

若依框架自带一个组件&#xff0c;封装了关于表格&#xff0c;展示和隐藏表格列的功能&#xff1b; 使用效果就是这样的&#xff0c;在表格上面&#xff0c;三个框&#xff0c;从左到右分别是隐藏上面搜索&#xff0c;刷新列表&#xff0c;和显隐列的功能&#xff1b; 一、下面…...

PTA-7-4 堆排序

代码如下: #include<iostream> using namespace std; void change(int arr[], int n, int i); int main() {int n,i,end,arr[1000];cin >> n;for (i 0; i < n; i){cin >> arr[i];}//进行一次排序,把最大值放到顶端for (i n/2-1; i > 0; i--){change…...

uniapp滑动页面切换和下拉刷新,触底加载更多(swiper + scroll-view)

因为官方文档乱七八糟的&#xff0c;所以自己来总结下 需求&#xff1a; 常见的上方tag标签切换&#xff0c;下方是页面&#xff0c;上面点击切换&#xff0c;下面页面也切换&#xff0c;下方列表有下拉刷新&#xff0c;触底加载更多 因为这两个组件都是固定高度的&#xff0c;…...

git 删除 submodule 子模块的步骤

实验有效&#xff0c;这里删除了两个 submodule。 1, 执行删除 submodule mkdir tmp1 && cd tmp1 && git clone --recursive ssh://gitaaa.bbb.ccc.git \ && cd ixsolver && git checkout -b abranch_01 \ && git submodule deini…...

一文彻底解析 Compose 的穿透刺客 -- CompositionLocal

Compose 官方说明一直很简洁&#xff1a;CompositionLocal 是通过组合隐式向下传递数据的工具。 两个核心&#xff1a;隐式、向下传递&#xff0c;咋一看很懵&#xff0c;先不着急去理解&#xff0c;我们先看一段非常简单的代码&#xff1a; class MainActivity : ComponentAc…...

iOS 位移枚举NS_OPTIONS(如何实现多个枚举值的同时传入判断)

一、场景 当我们使用枚举这个东西时&#xff0c;有时需要多个枚举值任一一个满足时就ture&#xff0c;但是常用的枚举NS_ENUM定义好的枚举只能挨个判断&#xff0c;写一坨就既不美观也不好阅读&#xff0c;如下&#xff1a; typedef NS_ENUM (NSInteger, RPTestType){RPTestT…...

【Axure高保真原型】树控制内联框架

今天和大家分享树控制内联框架的原型模板&#xff0c;点击树的箭头可以打开或者收起子节点&#xff0c;点击最后一级人物节点&#xff0c;可以切换右侧内联框到对应的页面&#xff0c;左侧的树是通过中继器制作的&#xff0c;使用简单&#xff0c;只需要按要求填写中继器表格即…...

Visual Studio常用快捷键及调试操作

CtrlF10 运行到光标处 调试时候不用一行行按F10了CtrlMM 折叠或展开当前方法CtrlMO 折叠所有方法CtrlML 展开所有方法CtrlEW 自动换行/取消自动换行CtrlU 选中文本转小写CtrlShiftU 选中文本转大写CtrlWinO 启动软键盘F9 光标行加断点CtrlAltB 打开断点窗口 或通过Debug -> …...

MySQL 从零开始:02 MySQL 安装

文章目录 1、下载 MySQL 安装程序2、安装 MySQL 要操作 MySQL &#xff0c;首先要安装 MySQL &#xff0c;本文将一步步展示如何安装 MySQL&#xff0c;简直详细到令人发指。 环境&#xff1a; 操作系统&#xff1a;Windows10 64位MySQL版本&#xff1a;社区版 8.0.11.0 1、下…...

GB28181/GB35114平台LiveGBS何如添加白名单,使指定海康、大华、华为等GB28181摄像头或录像机设备可以免密接入

1、什么是GB/T28181级联 协议定义中的解释如下&#xff1a; 级联 cascadednetworking 两个信令安全路由网关之间按照上下级关系连接,上级中心信令控制服务器通过信令安全路由网 关可调用下级中心信令控制服务器所管辖的监控资源,下级中心信令控制服务器通过信令安全路由网 关向…...

【计算机组成与体系结构Ⅱ】MIPS指令系统(实验)

实验2&#xff1a;MIPS指令系统 一&#xff1a;实验目的 了解和熟悉指令级模拟器。熟练掌握MIPSsim模拟器的操作和使用方法。熟悉MIPS指令系统及其特点&#xff0c;加深对MIPS指令操作语义的理解。熟悉MIPS体系结构。 二&#xff1a;实验要求 采用指令集和流水线操作级模拟器…...

jsonvue-mobile 联动方式说明。

目录 jsonvue-mobile的联动类型分为两种 一种是命令式的&#xff1a; 另一种是响应式的&#xff1a; 联动场景 场景一&#xff1a;某一个字段的值变化时&#xff0c;同步修改另一个字段的值 命令式&#xff1a; 响应式&#xff1a; 场景一演示效果GIF 场景二&#xff…...

abseil中的微操

给分支预测器的建议 原始代码 以下代码用于实现多线程中只调用一次的效果&#xff0c;这里的if大多数情况下都是false&#xff0c;即已经被调用过了。这里是否被调用过用的是一个std::atomic<uint32_t>的原子变量 template <typename Callable, typename... Args>…...

NLP论文阅读记录 - 2022 | WOS 数据驱动的英文文本摘要抽取模型的构建与应用

文章目录 前言0、论文摘要一、Introduction1.1目标问题1.2相关的尝试1.3本文贡献 二.相关工作三.本文方法四 实验效果4.1数据集4.2 对比模型4.3实施细节4.4评估指标4.5 实验结果4.6 细粒度分析 五 总结 前言 Construction and Application of a Data-Driven Abstract Extractio…...

虹科新闻丨LIBERO医药冷链PDF温度计完成2024年航空安全鉴定,可安全空运!

来源&#xff1a;虹科环境监测技术 虹科新闻丨LIBERO医药冷链PDF温度计完成2024年航空安全鉴定&#xff0c;可安全空运&#xff01; 原文链接&#xff1a;https://mp.weixin.qq.com/s/XHT4kU27opeKJneYO0WqrA 欢迎关注虹科&#xff0c;为您提供最新资讯&#xff01; 虹科LIBE…...

智能搬运机器人作为一种新型的物流技术

随着物流行业的快速发展&#xff0c;货物转运的效率和准确性成为了企业竞争的关键因素之一。智能搬运机器人作为一种新型的物流技术&#xff0c;已经在许多企业中得到了广泛应用。本文将介绍富唯智能智能搬运机器人在物流行业的应用和优势。 在实际应用中&#xff0c;智能搬运机…...

UI自动化测试工具对企业具有重要意义

随着软件行业的不断发展&#xff0c;企业对高质量、高效率的软件交付有着越来越高的要求。在这个背景下&#xff0c;UI自动化测试工具成为了企业不可或缺的一部分。以下是UI自动化测试工具对企业的重要作用&#xff1a; 1. 提高软件质量 UI自动化测试工具能够模拟用户的操作&am…...

Linux--进程状态与优先级

概念 进程指的是程序在执行过程中的活动。进程是操作系统进行资源分配和调度的基本单位。 进程可以看作是程序的一次执行实体&#xff0c;它包含了程序代码、数据以及相关的执行上下文信息。操作系统通过创建、调度和管理多个进程来实现对计算机系统资源的有效利用。 每个进程…...

如何实现无公网ip固定TCP端口地址远程连接Oracle数据库

文章目录 前言1. 数据库搭建2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射 3. 公网远程访问4. 配置固定TCP端口地址4.1 保留一个固定的公网TCP端口地址4.2 配置固定公网TCP端口地址4.3 测试使用固定TCP端口地址远程Oracle 前言 Oracle&#xff0c;是甲骨文公司的一款关系…...

工业视觉检测:从分类到检测的数据多样性策略对比与实战指南

1. 项目概述与核心问题在工业视觉检测领域&#xff0c;我们常常遇到一个令人头疼的“过拟合”现象&#xff1a;模型在实验室里用精心采集的样本训练&#xff0c;准确率能冲到99.9%&#xff0c;可一旦部署到产线上&#xff0c;面对光照变化、产品批次差异、背景干扰甚至相机抖动…...

ZYNQ UltraScale+ MPSoC实战:基于PL端AXI_UART16550 IP核与PS端中断机制,实现RS485多帧长数据可靠接收

1. 工业通信场景下的ZYNQ UltraScale MPSoC实战 在工业自动化领域&#xff0c;RS485总线因其抗干扰能力强、传输距离远等优势&#xff0c;成为设备间通信的主流选择。而ZYNQ UltraScale MPSoC凭借其独特的PSPL架构&#xff0c;能够完美应对工业通信中对实时性和可靠性的严苛要求…...

Swift 项目集成 MJRefresh 终极指南:SPM包管理与桥接文件配置详解

Swift 项目集成 MJRefresh 终极指南&#xff1a;SPM包管理与桥接文件配置详解 【免费下载链接】MJRefresh An easy way to use pull-to-refresh. 项目地址: https://gitcode.com/gh_mirrors/mj/MJRefresh MJRefresh 是一款简单易用的下拉刷新框架&#xff0c;能帮助 Swi…...

千问 LeetCode 2281.巫师的总力量和 public int totalStrength(int[] strength)

LeetCode 2281. 巫师的总力量和 是一道经典的 贡献法 + 单调栈 + 前缀和的前缀和 题目。题目要求对数组的所有非空连续子数组,计算: min(subarray) * sum(subarray) 的总和,并对 10^9 + 7 取模。 ✅ 解题思路(核心思想) 我们 不枚举所有子数组(那样是 O(n)),而是 枚…...

AI安全自动化测试:FuzzyAI模糊测试框架实战指南

1. 项目概述&#xff1a;当AI安全遇上自动化“模糊测试” 在大型语言模型&#xff08;LLM&#xff09;如ChatGPT、Claude、Gemini等日益普及的今天&#xff0c;我们享受其强大能力的同时&#xff0c;也面临着一个严峻的挑战&#xff1a;如何确保它们的安全与可控&#xff1f;你…...

多层板钻靶精度为什么越来越难控制?一套X-RAY预对位+六轴机械手的自动化方案解析

背景在高多层板和HDI板生产中&#xff0c;钻靶精度是影响良率的核心环节之一。压合后内层靶点被外层铜箔覆盖&#xff0c;传统视觉系统只能识别表面标记&#xff0c;无法获取真实的内层位置数据。同时&#xff0c;上料对位若依赖人工操作&#xff0c;放板角度和位置存在批次差异…...

AI搜索优化效果哪家好

传统行业获客越来越难&#xff0c;价格战打得头破血流&#xff0c;这是过去三年我听得最多的抱怨。但就在上个月&#xff0c;我用一个完全不同的方法&#xff0c;让公司的获客成本从单次300元降到了不到30元。秘密就在AI搜索优化&#xff0c;而这30天的实测&#xff0c;让我对市…...

技术人必备的Chrome插件清单:第7个让调试效率翻倍

对于软件测试从业者而言&#xff0c;浏览器早已不是单纯的信息浏览窗口&#xff0c;而是集接口调试、性能分析、元素定位、辅助功能验证于一体的核心工作站。面对日益复杂的Web应用和紧迫的交付周期&#xff0c;一套精悍的Chrome插件组合往往能带来远超预期的效率回报。本文从测…...

WordPress集成Claude AI:构建智能内容创作技术栈的实践指南

1. 项目概述与核心价值最近在折腾个人博客和内容创作工具链&#xff0c;发现了一个挺有意思的GitHub项目&#xff1a;mvtandas/wordpress-claude-stack。这名字一看就很有料&#xff0c;直接把WordPress和Claude这两个看似不搭界的玩意儿给“堆”到了一起。作为一个常年混迹在内…...

告别网盘限速困扰:网盘直链下载助手全面解析与应用指南

告别网盘限速困扰&#xff1a;网盘直链下载助手全面解析与应用指南 【免费下载链接】baiduyun 油猴脚本 - 一个免费开源的网盘下载助手 项目地址: https://gitcode.com/gh_mirrors/ba/baiduyun 还在为网盘下载速度缓慢而烦恼吗&#xff1f;网盘直链下载助手作为一款免费…...