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

Kotlin中的委托、属性委托和延迟加载

委托模式是一种常用的设计模式,用于将某个对象的责任委托给另一个对象来处理。在Kotlin中,委托可以通过关键字by来实现,主要分为类委托和属性委托两种形式。此外,Kotlin还提供了延迟加载的功能,可以在需要时才进行初始化。

类委托

类委托是一种将接口的实现委托给另一个类来完成的方式。在Kotlin中,我们可以通过接口来定义一系列功能,然后将这些功能的实现委托给其他类。下面是一个示例:

interface Wash {fun washDishes()
}class Child : Wash {override fun washDishes() {println("子类或实现类实现功能")}
}class Parent : Wash by Child()

在上面的示例中,接口Wash定义了洗碗的功能。Child类实现了这个接口,并提供了具体的洗碗实现。然后,Parent类通过关键字by将洗碗的任务委托给了Child类。这样,当我们调用Parent类的washDishes()方法时,实际上是由Child类来完成洗碗的操作。

val parent = Parent()
parent.washDishes() // 输出:子类或实现类实现功能

在上面的代码中,我们创建了一个Parent类的实例,并调用了其washDishes()方法。由于Parent类委托了Child类,所以实际上是调用了Child类的washDishes()方法。

除了直接将接口的实现委托给其他类外,我们还可以通过构造函数将委托对象作为参数传递给委托类。下面是一个使用构造函数进行委托的示例:

class Parent(washer: Wash) : Wash by washerval child = Child()
val parent = Parent(child)
parent.washDishes() // 输出:子类或实现类实现功能

在上面的示例中,我们定义了一个Parent类,其构造函数接受一个Wash类型的参数washer。通过关键字byParent类将洗碗的任务委托给了传入的washer对象。在main()函数中,我们创建了一个Child类的实例child,然后将其作为参数传递给Parent类的构造函数创建了一个parent对象。最后,我们调用parent对象的washDishes()方法,结果与之前相同。

属性委托

属性委托是一种将属性的读写操作委托给另一个对象来处理的方式。在Kotlin中,我们可以通过重载getValue()setValue()运算符函数来实现属性委托。下面是一个示例:

import kotlin.reflect.KPropertyclass Parent {var monkey: Int = 0operator fun getValue(child: Child, property: KProperty<*>): Int {println("getValue()方法被调用,修改的属性:${property.name}")return monkey}operator fun setValue(child: Child, property: KProperty<*>, value: Int) {println("setValue()方法被调用,修改的属性:${property.name} $value")monkey = value}
}class Child {var monkey: Int by Parent()
}

在上面的示例中,我们定义了一个Parent类和一个Child类。Parent类中包含一个monkey属性,而Child类通过关键字by将其monkey属性的读写操作委托给了Parent类。在Parent类中,我们重载了getValue()setValue()运算符函数,用于处理属性的读取和写入操作。在这两个函数中,我们输出了相应的信息以便观察委托的过程。

val child = Child()
child.monkey = 100 // 输出:setValue()方法被调用,修改的属性:monkey 100
child.monkey -= 50 // 输出:setValue()方法被调用,修改的属性:monkey -50
println(child.monkey) // 输出:getValue()方法被调用,修改的属性:monkey// 输出:-50

在上面的代码中,我们创建了一个Child类的实例child,并对其monkey属性进行了赋值和修改操作。由于Child类将这些操作委托给了Parent类,所以在赋值和修改的过程中,会分别调用Parent类的setValue()方法,并输出相应的信息。最后,我们打印child.monkey属性的值,实际上是调用了Parent类的getValue()方法,并输出了属性的值。

延迟加载

延迟加载(也称为懒加载)是一种在需要时才进行初始化的方式,可以提高程序的效率并加快程序的启动速度。在Kotlin中,我们可以通过关键字by lazy来实现延迟加载。延迟加载的变量要求声明为val,即不可变变量,相当于Java中用final关键字修饰的变量。下面是一个使用延迟加载的示例:

val content by lazy {println("hello lazy")"World"
}println(content) // 输出:hello lazy// 输出:World

在上面的示例中,我们定义了一个变量content,并使用by lazy将其声明为延迟加载变量。在lazy后面的大括号中,我们可以编写初始化代码块。在第一次访问content变量时,会执行初始化代码块,并输出其中的内容(“hello lazy”)。之后,再次访问content变量时,只会输出最后一行代码的内容(“World”)。这样,我们就实现了延迟加载的效果。

总结:

  • 委托模式是一种将对象的责任委托给其他对象来处理的方式,可以通过关键字by来实现。
  • 类委托将接口的实现委托给其他类来完成,可以直接委托或通过构造函数传递委托对象。
  • 属性委托将属性的读写操作委托给其他对象来处理,可以通过重载getValue()setValue()运算符函数实现。
  • 延迟加载可以提高程序效率和启动速度,通过关键字by lazy来实现,延迟加载的变量要求声明为不可变变量。

相关文章:

Kotlin中的委托、属性委托和延迟加载

委托模式是一种常用的设计模式&#xff0c;用于将某个对象的责任委托给另一个对象来处理。在Kotlin中&#xff0c;委托可以通过关键字by来实现&#xff0c;主要分为类委托和属性委托两种形式。此外&#xff0c;Kotlin还提供了延迟加载的功能&#xff0c;可以在需要时才进行初始…...

轻松合并Excel工作表:Java批量操作优化技巧

摘要&#xff1a;本文由葡萄城技术团队于CSDN原创并首发。转载请注明出处&#xff1a;葡萄城官网&#xff0c;葡萄城为开发者提供专业的开发工具、解决方案和服务&#xff0c;赋能开发者。 前言 在Excel中设计表单时&#xff0c;我们经常需要对收集的信息进行统计分析。例如&a…...

计算机网络_网络层概述

4.1 网络层概述 4.1.1 一.分组转发和路由选择 网络层的主要任务就是将分组从源主机经过多个网络和多段链路传输到目的主机&#xff0c;可以将该任务划分为分组转发和路由选择两种重要的功能。 注释:A发送到B,从1端口进入. 如何得知是从2还是从3中转发出去呢?--------->这…...

自然语言处理---Transformer机制详解之GPT2模型介绍

1 GPT2的架构 从模型架构上看, GPT2并没有特别新颖的架构, 它和只带有解码器模块的Transformer很像. 所谓语言模型, 作用就是根据已有句子的一部分, 来预测下一个单词会是什么. 现实应用中大家最熟悉的一个语言模型应用, 就是智能手机上的输入法, 它可以根据当前输入的内容智…...

ChatGPT 即将诞生一周年,OpenAI 将有大动作

图片来源&#xff1a;由无界AI生成 下个月就是 ChatGPT 一周年纪念日。OpenAI 正在谋划新的大动作。可以肯定地说&#xff0c;自诞生以来&#xff0c;ChatGPT 就为 OpenAI 提供了不可阻挡的增长动力。 01 营收超预期&#xff0c;OpenAI 缓了一口气 据 The Information 报道&…...

jenkins 原理篇——pipeline流水线 声明式语法详解

大家好&#xff0c;我是蓝胖子&#xff0c;相信大家平时项目中或多或少都有用到jenkins&#xff0c;它的piepeline模式能够对项目的发布流程进行编排&#xff0c;优化部署效率&#xff0c;减少错误的发生&#xff0c;如何去写一个pipeline脚本呢&#xff0c;今天我们就来简单看…...

在ESP32-Arduino开发中添加其它Arduino库

目录 前言 原理说明 操作步骤 下载Bounce 安装Bounce 将下载的文件夹(压缩包需要解压)移动到components/arduino/libraries路径下&#xff0c;并重命名为Bounce2 查看添加库里所有的源文件位置 在arduino的CMakeList.txt里添加库源文件 使用Bounce 前言 乐鑫官方的es…...

CAN总线测试——CAN一致性之物理层

CAN一致性物理层测试项 1.最小通讯电压测试2.最大通讯电压测试3.显性位/隐性位输出电压测试4.信号跳变沿测试5. 地偏移6. 终端电阻 1.最小通讯电压测试 2.最大通讯电压测试 3.显性位/隐性位输出电压测试 4.信号跳变沿测试 5. 地偏移 6. 终端电阻...

macrodata数据集在Python统计建模和计量经济学中的应用

目录 一、数据介绍二、应用三、statsmodels 统计模块四、使用 statsmodels 统计模块分析 macrodata.csv 数据集参考 一、数据介绍 macrodata.csv是一个示例数据集&#xff0c;通常用于统计分析和计量经济学中的教育和训练目的。这个数据集通常包括以下列&#xff1a; year&am…...

【C++进阶(九)】C++多态深度剖析

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:C从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习C   &#x1f51d;&#x1f51d; 多态 1. 前言2. 多态的概念以及定义3. 多态的实…...

第二节——Vue 基本介绍

一、MV*的理解 1、概念 在计算机编程领域&#xff0c;MV*&#xff08;也称为MVC、MVP、MVVM等&#xff09;是一种用于组织和设计应用程序结构的模式。这些模式旨在实现应用程序的解耦、可维护性和可扩展性。MV代表着Model-View-&#xff08;表示控制器或视图模型等其他组件&a…...

基于ResNet34的花朵分类

一.数据集准备 新建一个项目文件夹ResNet&#xff0c;并在里面建立data_set文件夹用来保存数据集&#xff0c;在data_set文件夹下创建新文件夹"flower_data"&#xff0c;点击链接下载花分类数据集https://storage.googleapis.com/download.tensorflow.org/example_i…...

[计算机提升] 数据及相关概念

1.9 数据及相关概念 1.9.1 数据、信息 在Windows系统中&#xff0c;数据是指事实或信息的集合&#xff0c;可以是数字、文本、图像、声音等形式的内容。数据是计算机系统中处理和操作的基本元素&#xff0c;是信息的表现形式和载体。 与信息相比&#xff0c;数据的范围更广泛…...

第18章 SpringCloud生态(二)

18.11 说说你了解的负载均衡算法 难度:★★ 重点:★★★★ 白话解析 常用的负载均衡算法有: 1、轮询(Round Robin):说白了就是让服务器排好队,一个个轮着来调用;Ribbon默认采用该算法。 优点:实现起来简单; 缺点:服务器性能不一样的情况下,导致能力强的会经常空闲…...

【Android】BRVAH多布局实现

前言 基于3.0.4版本的BRVAH框架实现的 实现方法 1.创建多个不同类型的布局&#xff08;步骤忽略&#xff09; 2.创建数据实体类 数据类要实现【MultiItemEntity】接口 class MyMultiItemEntity(//获取布局类型override var itemType: Int,var tractorRes: Int? null,va…...

AWS SAP-C02教程9-节省成本

SAP-C01变成SAP-C02的时候,最大的变化就是没有把成本单独列出一个模块,但是成本依然包含在各个其它模块之中,所以成本还是很重要的。本章将列举一些成本优化方案以及一些成本辅助功能。 目录 1 Cost Allocation Tags2 Trusted Advisor2.1 AWS Support Plans2.2 基本特性2.3…...

[CSP-S 2023] 种树 —— 二分+前缀和

This way 题意&#xff1a; 一开始以为是水题&#xff0c;敲了一个二分贪心检查的代码&#xff0c;20分。发现从根往某个节点x走的时候&#xff0c;一路走来的子树上的节点到已栽树的节点的距离会变短&#xff0c;那么并不能按照初始情况贪心。 于是就想着检查时候用线段树…...

【LeetCode周赛】LeetCode第368场周赛

目录 元素和最小的山形三元组 I元素和最小的山形三元组 II合法分组的最少组数 元素和最小的山形三元组 I 给你一个下标从 0 开始的整数数组 nums 。 如果下标三元组 (i, j, k) 满足下述全部条件&#xff0c;则认为它是一个山形三元组 &#xff1a; i < j < k nums[i] &l…...

【智慧工地源码】基于AI视觉技术赋能智慧工地

伴随着技术的不断发展&#xff0c;信息化手段、移动技术、智能穿戴及工具在工程施工阶段的应用不断提升&#xff0c;智慧工地概念应运而生&#xff0c;庞大的建设规模催生着智慧工地的探索和研发。 建筑施工具有周期长、环境复杂、工序繁杂、人员流动性大等特点&#xff0c;所以…...

云服务器搭建Hadoop分布式

文章目录 1.服务器配置2.Java环境3. 安装Hadoop4. 集群配置5. 编写集群的启动脚本 1.服务器配置 服务器主机名配置115.157.197.82s110核115.157.197.84s210核115.157.197.109s310核115.157.197.31s410核115.157.197.60gracal10核 所有的软件安装在/opt/module下&#xff0c;软…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明&#xff1a; 想象一下&#xff0c;你正在用eNSP搭建一个虚拟的网络世界&#xff0c;里面有虚拟的路由器、交换机、电脑&#xff08;PC&#xff09;等等。这些设备都在你的电脑里面“运行”&#xff0c;它们之间可以互相通信&#xff0c;就像一个封闭的小王国。 但是&#…...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会&#xff0c;其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具&#xff0c;对过去十年 WWDC 主题演讲内容进行了系统化分析&#xff0c;形成了这份…...

前端倒计时误差!

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

Nuxt.js 中的路由配置详解

Nuxt.js 通过其内置的路由系统简化了应用的路由配置&#xff0c;使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

C++ 基础特性深度解析

目录 引言 一、命名空间&#xff08;namespace&#xff09; C 中的命名空间​ 与 C 语言的对比​ 二、缺省参数​ C 中的缺省参数​ 与 C 语言的对比​ 三、引用&#xff08;reference&#xff09;​ C 中的引用​ 与 C 语言的对比​ 四、inline&#xff08;内联函数…...

微服务商城-商品微服务

数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...

JavaScript基础-API 和 Web API

在学习JavaScript的过程中&#xff0c;理解API&#xff08;应用程序接口&#xff09;和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能&#xff0c;使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...

python爬虫——气象数据爬取

一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用&#xff1a; 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests&#xff1a;发送 …...

stm32wle5 lpuart DMA数据不接收

配置波特率9600时&#xff0c;需要使用外部低速晶振...

java高级——高阶函数、如何定义一个函数式接口类似stream流的filter

java高级——高阶函数、stream流 前情提要文章介绍一、函数伊始1.1 合格的函数1.2 有形的函数2. 函数对象2.1 函数对象——行为参数化2.2 函数对象——延迟执行 二、 函数编程语法1. 函数对象表现形式1.1 Lambda表达式1.2 方法引用&#xff08;Math::max&#xff09; 2 函数接口…...