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

【编程语言】Kotlin快速入门 - 伴生对象与懒加载

静态与顶层方法

静态方法(伴生对象)

Java中有静态方法的概念,但是在Kotlin中这个静态方法被弱化了,还记得我们使用object创建一个单例类吗,创建的单例类我们当时可以使用像静态方法一样的调用方式取调用,但object修饰的类会把它的所有方法都变成类似静态方法一样的调用,于是Kotlin提供了companion object修饰符,用于在类中修饰静态方法,那样一个类就可以同时存在静态和非静态方法了。

class Student(name: String, age: Int, val clazz: String): Person(name, age), Study {override fun doHomeWork() {println("do homework.")}companion object {fun sayHello() {println("Hello!")}}
}

但是这种方式产生的类似静态方法一样的调用并非真正的静态方法,如果你在Java中使用类似静态方法的调用会发现根本找不到这个方法,companion object只是语法上模拟静态方法的调用方式,实际上它们都不是真正的静态方法,因此你如果需要在Java中调用,那么你需要在方法上加上@JvmStatic注解

class Student(name: String, age: Int, val clazz: String): Person(name, age), Study {override fun doHomeWork() {println("do homework.")}companion object {@JvmStaticfun sayHello() {println("Hello!")}}
}
顶层方法

在kotlin中,顶层方法指的是不用类似静态方法那样的调用方式调用的方法,比如Helper.kt文件中有一个sayHello方法,那么sayHello就是一个顶层方法,你可以在其他类中通过sayHello()直接调用,而不用通过Helper.sayHello()调用。

顶层方法的定义就是单纯一个kt文件,在里面定义的所有fun方法都将做为顶层方法,例如:

package dev.xuanran.kt2// Helper.kt
fun sayHello() {println("Hello!")
}
package dev.xuanran.kt2// Main.kt
fun main() {sayHello()
}

由于Java中没有顶层方法的概念,所以在Java中如果需要调用顶层方法的话,那么就需要通过Helper.sayHello()的形式调用。

延迟初始化

在正常的开发中,类里面肯定存在很多全局变量,而很多全局变量可能只有在类初始化的时候才能去创建实例,但由于Kotlin的变量不可为空的机制,你只能给类似的变量类型后面加上?来先手动给它赋值为null(这里的Demo假设student的对象实例需要通过网络获取)。

var student : Student? = nullfun main() {// network...
}

但是这样会产生一个缺点就是后续你再去调用student内部的方法时,因为你允许这个变量可空,所以每次调用都需要来检查是否为空。

为此,Kotlin提供了延迟初始化功能,使用lateinit修饰全局变量,那么就可以避免可空修饰?以及后续每次使用前用if判空。

lateinit var student: Studentfun main() {// network...student.doReadBook()
}

但是lateinit关键字也不是没有风险,如果你在它之前就调用它,那么还是会产生Exception的。

紧接着Kotlin也给我们提供了一种方式,帮助我们判断某个全局变量是否已初始化:::变量名.isInitialized,如果已经初始化过了,我们就可以不用再执行初始化操作了。

lateinit var student: Studentfun main() {if (!::student.isInitialized) {// network...}student.doReadBook()
}

lazy懒加载

lazy代码块是Kotlin提供的一种懒加载技术,代码块中的代码一开始并不会执行,只有当修饰的变量首次被调用的时候才会执行,并且将最后一行代码的返回值赋值给被修饰的全局变量,具体语法规则如下:

val p by lazy {println("b")"c"
}fun main() {println("a")println(p)
}

输出结果:a b c

相关文章:

【编程语言】Kotlin快速入门 - 伴生对象与懒加载

静态与顶层方法 静态方法(伴生对象) Java中有静态方法的概念,但是在Kotlin中这个静态方法被弱化了,还记得我们使用object创建一个单例类吗,创建的单例类我们当时可以使用像静态方法一样的调用方式取调用,…...

三、数据聚合和函数

在数据聚合和函数方面,数据库提供了许多功能强大的函数,可以帮助你处理和分析数据。以下是一些常用的函数及其功能的详细说明: COUNT函数: COUNT函数用于计算指定列中的行数。它可以用于统计表中满足特定条件的行数,也…...

Golang | Leetcode Golang题解之第500题键盘行

题目: 题解: func findWords(words []string) (ans []string) {const rowIdx "12210111011122000010020202" next:for _, word : range words {idx : rowIdx[unicode.ToLower(rune(word[0]))-a]for _, ch : range word[1:] {if rowIdx[unico…...

如何实现金蝶商品数据集成到电商系统的SKU

如何实现金蝶商品数据集成到电商SKU系统 金蝶商品数据集成到电商SKU的技术实现 在现代企业的数据管理中,系统间的数据对接与集成是提升业务效率和准确性的关键环节。本文将分享一个实际案例:如何通过轻易云数据集成平台,将金蝶云星辰V2中的商…...

100种算法【Python版】第4篇——回溯法

念念不忘,必有回响 1 回溯法原理2 示例说明2.1 生成子集2.1.1 回溯法思路2.1.2 Python3代码2.2 N皇后问题2.2.1 回溯法思路2.2.2 Python3代码3 回溯法应用3.1 组合3.1.1 回溯法思路3.1.2 Python3代码3.2 数独 Solver3.2.1 回溯法思路3.2.2 Python3代码3.3 多重背包问题3.3.1 P…...

R语言机器学习算法实战系列(九)决策树分类算法 (Decision Trees Classifier)

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍教程下载数据加载R包导入数据数据预处理数据描述数据切割调节参数构建模型模型的决策树预测测试数据评估模型模型准确性混淆矩阵模型评估指标ROC CurvePRC Curve特征的重要性保存模…...

听泉鉴宝在三个月前已布局商标注册!

近日“听泉鉴宝”以幽默的风格和节目效果迅速涨粉至2500多万,连线出现“馆藏文物”和“盗墓现场”等内容,听泉鉴宝早在几个月前已布局商标注册。 据普推知产商标老杨在商标局网站检索发现,“听泉鉴宝”的主人丁某所持股的江苏灵匠申请了三十…...

vscode设置特定扩展名文件的打开编码格式

用vscode 编辑c语言或者Verilog代码, 由于其它开发工具的文件编码格式无法修改,默认只能是gb2312, 与我们国内奉行的统一 utf8 不一致. 所以只能是更改特殊文件的打开方式. 配置方式如下. 关键配置如下: {"git.openRepositoryInParentFolders": "never",…...

Linux——动态卷的管理

确保已经设置了对应的动态卷的驱动(provisioner 制备器)基于动态驱动创建对应的存储类创建PVC (PVC 将会自动根据大小、访问模式等创建PV)Pod的spec 中通过volumes 和 volumemounts 来完成pvc 的绑定和pvc对应pv的挂载删除pod 不…...

第三季度中国游戏市场收入创历史新高;京东物流与淘宝天猫达成合作;YouTube 上线“用相机拍摄”标签....|网易数智日报

第三季度中国游戏市场收入917.66亿,创历史新高 中国音数协游戏工委今日发布了最新的 2024 年第三季度中国游戏产业季度报告。 数据显示,2024 年第三季度中国游戏市场收入 917.66 亿元,环比增长 22.96%,同比增长 8.95%。 中国音…...

智慧城管综合管理系统源码,微服务架构,基于springboot、vue+element+uniapp技术开发,支持二次开发

智慧城管源码,智慧城管执法办案系统源码 智慧城管综合执法办案平台是智慧城市框架下,依托物联网、云计算、多网融合等现代化技术,运用数字基础资源、多维信息感知、协同工作处置、智能化辅助决策分析等手段,形成具备高度感知、互联…...

2024Flutter面试题

1.Dart是值传递还是引用传递? dart是值传递。 每次调用函数,传递过去的都是对象的内存地址,而不是这个对象的赋值。 2.简述Dart语音特性 在Dart中,一切都是对象,所有的对象都是继承自Object Dart是强类型语言&#…...

MySQL-23.多表查询-内连接

一.内连接 -- 多表查询 select * from tb_emp,tb_dept where tb_emp.dept_id tb_dept.id;-- 内连接 -- A.查询员工的姓名,及所属的部门名称(隐式内连接实现) select tb_emp.name as 员工姓名,tb_dept.name as 部门名称 from tb_emp,tb_dep…...

实用的 Python 小脚本

一、引言 在日常办公和电脑使用中,我们经常会遇到一些重复性的任务或需要快速获取特定信息的情况。Python 作为一种强大而灵活的编程语言,可以用来编写各种小脚本,以自动化这些任务并提高工作效率。本文将介绍一些 Python 常用的小脚本&…...

哪种掏耳朵方式好?正确的掏耳工具!

人体的耳屎会随着活动量加大而增加,如果长期不清理,耳屎堆积在耳道深处很有可能会堵塞鼓膜甚至影响听力。但如果需要清理耳屎的话,哪种掏耳朵方式好呢?可视挖耳勺可以帮助我们在全程可视的情况下,精准有效地完成采耳&a…...

如何让别人喜欢你的代码

良好的编码习惯是编程人员的基本素养,有利于后期人员的维护和查看。 毕竟大家都喜欢美女和靓仔 目录 js函数注释规范 案例 其他 推荐链接 js函数注释规范 常用符号 说明 用法 param 参数 param {type} name return 返回值 return {type} 案例 /***…...

【Flutter】Dart:库

在 Dart 中,库(Library)是组织和重用代码的基本方式。通过库,我们可以将代码分割成模块化的部分,方便管理和共享,同时避免命名冲突。Dart 提供了大量内置库,用于支持常见的功能,比如…...

从0开始深度学习(18)——环境和分布偏移

有时,根据测试集的精度衡量,模型表现得非常出色。 但是当数据分布突然改变时,模型在部署中会出现灾难性的失败。 有时模型的部署本身就是扰乱数据分布的催化剂。 举一个有点荒谬却可能真实存在的例子。 假设我们训练了一个贷款申请人违约风险…...

Java项目-基于springboot框架的线上买菜系统项目实战(附源码+文档)

作者:计算机学长阿伟 开发技术:SpringBoot、SSM、Vue、MySQL、ElementUI等,“文末源码”。 开发运行环境 开发语言:Java数据库:MySQL技术:SpringBoot、Vue、Mybaits Plus、ELementUI工具:IDEA/…...

API接口的未来趋势:智能化、自动化与集成化的发展

在当今数字化驱动的世界中,应用程序编程接口(API)已成为连接不同软件、平台和服务的关键桥梁。随着技术的不断进步,API接口的未来趋势将聚焦于智能化、自动化与集成化的发展。本文将深入探讨这些趋势,并分析其在推动数…...

19c补丁后oracle属主变化,导致不能识别磁盘组

补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战

前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...

反向工程与模型迁移:打造未来商品详情API的可持续创新体系

在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】

微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

聊聊 Pulsar:Producer 源码解析

一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...

ffmpeg(四):滤镜命令

FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...

重启Eureka集群中的节点,对已经注册的服务有什么影响

先看答案,如果正确地操作,重启Eureka集群中的节点,对已经注册的服务影响非常小,甚至可以做到无感知。 但如果操作不当,可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...

Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?

在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...

C++.OpenGL (20/64)混合(Blending)

混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...

如何更改默认 Crontab 编辑器 ?

在 Linux 领域中,crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用,用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益,允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...