【编程语言】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接口的未来趋势将聚焦于智能化、自动化与集成化的发展。本文将深入探讨这些趋势,并分析其在推动数…...
观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...
Flask RESTful 示例
目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...
MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...
最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...
论文笔记——相干体技术在裂缝预测中的应用研究
目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术:基于互相关的相干体技术(Correlation)第二代相干体技术:基于相似的相干体技术(Semblance)基于多道相似的相干体…...
初探Service服务发现机制
1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能:服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源…...
Python Einops库:深度学习中的张量操作革命
Einops(爱因斯坦操作库)就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库,用类似自然语言的表达式替代了晦涩的API调用,彻底改变了深度学习工程…...
