延迟初始化和密封类
Kotlin 延迟初始化(Lazy Initialization)
定义
在 Kotlin 中,延迟初始化允许你延迟一个对象的初始化,直到首次访问该对象时才进行初始化。这通常用于那些初始化开销较大,或者只在程序运行的某个特定点才需要的对象。Kotlin 提供了 lazy 委托属性来实现延迟初始化。
使用
要使用 lazy 进行延迟初始化,你需要将 lazy 委托用于一个 val 属性,并且提供一个 lambda 表达式来初始化该值。这个 lambda 表达式只会在第一次访问该属性时被调用。
下面是一个示例:
import kotlin.lazy | |
class MyClass { | |
// 使用 lazy 进行延迟初始化 | |
val lazyValue: String by lazy { | |
println("Initializing lazyValue") | |
"This is the value" | |
} | |
fun useLazyValue() { | |
println(lazyValue) | |
} | |
} | |
fun main() { | |
val myClass = MyClass() | |
myClass.useLazyValue() // 输出 "Initializing lazyValue" 和 "This is the value" | |
myClass.useLazyValue() // 只输出 "This is the value",因为 lazyValue 已经被初始化了 | |
} |
在上面的例子中,lazyValue 属性使用了 lazy 委托,并且提供了一个 lambda 表达式来初始化它。当我们第一次调用 useLazyValue() 方法时,lazyValue 会被初始化,并且打印出 "Initializing lazyValue"。当我们再次调用 useLazyValue() 时,因为 lazyValue 已经被初始化了,所以不会再次执行 lambda 表达式,只会打印出 "This is the value"。
线程安全
默认情况下,lazy 是线程安全的,它会确保在多线程环境中只初始化一次。但是,如果你确定你的代码将在单线程环境中运行,并且想要提高性能,你可以使用 LazyThreadSafetyMode.NONE 参数来创建一个非线程安全的延迟初始化属性。
Kotlin 密封类(Sealed Classes)
定义
密封类是一种特殊的类,用于表示受限的类继承结构:当一个值可以是有限集合中的几种类型之一时,你可以使用密封类来表示它。在密封类的子类中,所有的子类都必须在相同的文件中声明。
使用
使用密封类可以帮助你优化代码,特别是在处理有限集合的类型时。通过使用密封类,你可以确保不会有其他未声明的子类存在,这有助于保持代码的清晰性和可维护性。
下面是一个示例:
sealed class Expression { | |
class Constant(val number: Double) : Expression() | |
class Sum(val e1: Expression, val e2: Expression) : Expression() | |
// 其他可能的子类... | |
// 示例:评估表达式 | |
fun evaluate(): Double = when (this) { | |
is Constant -> number | |
is Sum -> e1.evaluate() + e2.evaluate() | |
// 处理其他可能的子类... | |
else -> throw IllegalArgumentException("Unknown expression") | |
} | |
} | |
fun main() { | |
val sum = Expression.Sum(Expression.Constant(1.0), Expression.Constant(2.0)) | |
println(sum.evaluate()) // 输出 3.0 | |
} |
在上面的例子中,我们定义了一个 Expression 密封类,它有两个子类:Constant 和 Sum。我们还定义了一个 evaluate 方法,该方法使用 when 表达式来根据表达式的类型执行不同的操作。由于 Expression 是一个密封类,所以我们可以确保 when 表达式中的 else 分支永远不会被执行(除非我们添加了新的子类但忘记了更新 when 表达式)。这有助于我们避免运行时错误,并使代码更加清晰和可维护。
相关文章:
延迟初始化和密封类
Kotlin 延迟初始化(Lazy Initialization) 定义 在 Kotlin 中,延迟初始化允许你延迟一个对象的初始化,直到首次访问该对象时才进行初始化。这通常用于那些初始化开销较大,或者只在程序运行的某个特定点才需要的对象。…...
Kotlin基础之基本语法
Kotlin 简介 Kotlin 是一种由 JetBrains 开发的静态类型编程语言,设计用于与 Java 虚拟机 (JVM) 兼容,同时也可用于 Android、JavaScript(通过 Kotlin/JS)和原生(通过 Kotlin/Native)开发。Kotlin 旨在提供…...
多态(难的起飞)
注意 virtual关键字: 1、可以修饰原函数,为了完成虚函数的重写,满足多态的条件之一 2、可以菱形继承中,去完成虚继承,解决数据冗余和二义性 两个地方使用了同一个关键字,但是它们互相一点关系都没有 虚函…...
安装GO环境
#windows 1.下载go的安装包msi,下载完双击运行,指定一个目录进行安装 #msi安装时,会自动设置以下环境变量: #GOPATH(默认设置为C:\Users\hhx\go), #C:\Users\hhx\go\bin, #go安装位置下的bin目录 2.检查是否安装成功,终端中运行go version解释一些环境变量 GOROOT:go的安装位置…...
记一次由于代码原因导致Mysql连接被打满和唯一索引重复问题
先说一下事情产生的背景:原先的代码逻辑是消费MQ,然后请求其他服务的接口,对接口的返回值result做落库操作,现在要新加个逻辑,做完落库操作后还要再将result封装落到新表中;即消费一次MQ(MQ消息的频率非常高…...
redis数据类型之string,list
华子目录 key操作说明SCAN cursor [MATCH pattern] [COUNT count]dump与restorekeys 通配符 示例演示 string说明setbit key offset valuegetbit key offsetsetrange key offset value List结构图相关命令lrem key count valueltrim key count value示例:使用 LTRIM…...
Android android.os.DeadObjectException aidl通信异常分析及解决
问题描述 做一款音乐播放应用,播放服务是通过AIDL形式对外暴露,允许跨进程调用且多个App同时操作音乐播放,偶现android.os.DeadObjectException问题 12-15 09:28:12.371: W/System.err(5412): android.os.DeadObjectException 12-15 09:28:…...
dp + 计数,1954D - Colored Balls
一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 Problem - 1954D - Codeforces 二、解题报告 1、思路分析 本题前置题目: 1953. 你可以工作的最大周数 通过前置题目可以知道如何计算两两不同数对序列的最大长度 我们记最大数量为ma…...
【设计模式深度剖析】【5】【结构型】【桥接模式】| 以电视和遥控器为例加深理解
👈️上一篇:组合模式 设计模式-专栏👈️ 目 录 桥接模式(Bridge Pattern)定义英文原话是:直译理解 4个角色UML类图代码示例 应用优点缺点使用场景 示例解析:电视和遥控器UML类图 桥接模式(Bridge Pattern) 定义 英文原话是&am…...
一键安装脚本sh
首先是初始化的ros安装的一些库; install.sh: execute_command() {if [ "$1" "1" ]; thenwget http://fishros.com/install -O fishros && bash fishroselif [ "$1" "2" ]; then#gnome-terminal --title"n…...
WebGL在医学成像方面的应用
WebGL(Web Graphics Library)是一种用于在Web浏览器中呈现3D和2D图形的JavaScript API。它被广泛应用于各种领域,包括医学成像。以下是WebGL在医学成像方面的应用及其详细描述。北京木奇移动技术有限公司,专业的软件外包开发公司&…...
SpringBoot+layuimini实现角色权限菜单增删改查(layui扩展组件 dtree)
角色菜单 相关组件方法效果图MySQL代码实现资源菜单树组件实现权限树方法js这里我先主要实现权限树的整体实现方法,如果是直接查看使用的话可以只看这里! 后端代码Controlle层代码Service代码及实现类代码Service代码ServiceImpl代码 resourceMapper 代码…...
项目范围管理
目录 1.概述 2.主要工作 3.基础 4.项目范围管理的过程 5.规划范围管理 6.收集需求 7.定义范围 8.创建 WBS 9.确认范围 10.控制范围 1.概述 项目范围管理是项目管理中的一个重要组成部分,涉及到确定项目需要完成的工作范围,以及如何管理和控制…...
监管端..
文章目录 1. 登录流程2. 日志AOP 1. 登录流程 使用账号(手机号)、密码、验证码。登录就是获取token的,输入的账号密码用RSA加密(非对称) 首先输入账号密码,在发送手机验证码时候先校验账号密码有没有输入…...
点击登录按钮先检测输入框的规则检测(vue组合式)
<template><el-form :model"user" :rules"rules" ref"loginForm" label-width"auto" style"max-width: 600px"><el-form-item label"用户名" prop"name"><el-input v-model"…...
网络工程师---第四十二天
1、基于子网的vlan划分配置步骤是什么? 2、基于端口的vlan划分配置步骤是什么? 3、基于MAC地址的vlan划分配置步骤是什么? 4、请简述无线局域网的组网方式有哪几种,区别是什么? 5、请简述堆叠、级联和集群作用和区别是…...
leetcode 1241每个帖子的评论数(postgresql)
需求 编写 SQL 语句以查找每个帖子的评论数。 结果表应包含帖子的 post_id 和对应的评论数 number_of_comments 并且按 post_id 升序排列。 Submissions 可能包含重复的评论。您应该计算每个帖子的唯一评论数。 Submissions 可能包含重复的帖子。您应该将它们视为一个帖子。…...
前端最新面试题(ES6模块篇)
目录 1 ES5、ES6和ES2015有什么区别? 2 babel是什么,有什么作用? 3 let有什么用,有了var为什么还要用let? 4 举一些ES6对String字符串类型做的常用升级优化? 5 举一些ES6对Array数组类型做的常用升级优化 6 举一些ES6对Number数字类型做的常用升级优化 7 举一些ES…...
STM32H750外设之ADC通道选择
目录 概述 1 通道选择功能介绍 2 通道选择( SQRx、 JSQRx) 2.1 通道复用 2.1.1 通道介绍 2.1.2 通道框图 2.2 转换分组 2.3 内部专用通道 3 通道预选寄存器 (ADCx_PCSEL) 3.1 功能介绍 3.2 预选通道寄存器 概述 本位主要介绍STM32H750外设之…...
【Unity2D 2022:Cinemachine】相机跟随与地图边界
一、导入Cinemachine工具包 1. 点击Window-Package Manager,进入包管理界面 2. 点击All,找到Cinemachine工具包,点击Install 二、相机跟随角色 1. 选中Main Camera,点击Component-Cinemachine-CinemachineBrain,新建…...
好写作AI“期刊论文智造局”:解锁学术发表的通关秘籍
在学术的江湖里,期刊论文就像是一把把锋利的宝剑,是学者们披荆斩棘、开疆拓土的得力武器。然而,想要打造出一把称手的“宝剑”,从选题到撰写,再到格式调整,每一步都充满挑战。别愁啦!好写作AI化…...
企业财务自动化全场景落地,从入门到精通的完整指南 —— 2026企业级智能体选型与实战路径
在2026年的数字化深水区,企业财务管理正经历从“信息化”向“原生智能化”的跨代跃迁。 随着金税四期的全场景覆盖与数据要素资产化的推进,财务部门已不再满足于基础的流程自动化。 从“钱、票、账、税、资”的碎片化处理,到构建全链路闭环的…...
单相级联H桥(CHB)多电平变换器并网仿真,网侧电压220V PR电压外环 ,PI电流内环,有...
单相级联H桥(CHB)多电平变换器并网仿真,网侧电压220V PR电压外环 ,PI电流内环,有独立的电容电压平衡控制,使用三个全桥子模块,可输出7电平,可供参考学习单相级联H桥多电平变换器这…...
三菱FX5U ModbusTCP从站配置避坑指南:从IP冲突到通讯成功的完整流程
三菱FX5U ModbusTCP从站配置避坑指南:从IP冲突到通讯成功的完整流程 工业自动化领域中,ModbusTCP通讯协议因其简单高效的特点,成为PLC与上位机交互的常用方式。三菱FX5U系列PLC作为一款高性价比的可编程控制器,在中小型自动化项目…...
技术赋能B端拓客:号码核验行业的迭代与价值升级
2026年,数字经济高质量发展进入深水区,B端市场的竞争逻辑已从“规模制胜”转向“效能突围”,拓客环节的精细化、高效化成为企业构建核心竞争力的关键。号码核验作为B端拓客的前置基础性环节,直接关联线索质量、人力效能与拓客投入…...
文件夹的修改日期可以改吗?分享你三个修改方法
在电脑文件管理中,系统不支持直接修改文件夹的「修改时间」,但日常整理文件、统一项目时间戳、还原备份文件夹时间、办公归档时,经常需要自定义修改这个属性。本文给大家整理了3 种实用方法:第一种是汇帮批量重命名工具࿰…...
Python 实战:数据归一化 4 种核心方法对比 + 代码实现(机器学习必看)
在机器学习、深度学习的数据预处理中,数据归一化是绕不开的关键步骤。不同特征往往量纲不同(比如年龄 18-60、收入 1000-100000),直接训练模型会导致:梯度下降收敛慢、难以最优解距离类算法(KNN、K-Means、…...
腾讯云记忆服务,让智能助理进化升级
4月3日消息,腾讯云近日推出“Agent Memory”记忆服务,为智能助理OpenClaw补全长期记忆能力。接入该服务后,OpenClaw回答准确率大幅提升,还支持多种部署方式。创新记忆服务诞生腾讯云数据库团队自主研发了“Agent Memory”记忆服务…...
如何快速部署DeepQA:10分钟搭建你的第一个AI聊天机器人
如何快速部署DeepQA:10分钟搭建你的第一个AI聊天机器人 【免费下载链接】DeepQA My tensorflow implementation of "A neural conversational model", a Deep learning based chatbot 项目地址: https://gitcode.com/gh_mirrors/de/DeepQA DeepQA是…...
AA-PEG-C12/C16/C18,乙酸聚乙二醇月桂/棕榈/硬脂酸酯,一类结合了乙酸、聚乙二醇和长链烷基的化合物
一.名称英文名称:AA-PEG-C12/C16/C18,Acetic Acid-PEG-C12/C16/C18中文名称:乙酸聚乙二醇月桂/棕榈/硬脂酸酯,乙酸-PEG-月桂/棕榈/硬脂酸酯分子量:1k,2k,3.4k,5k,10k&…...
