Android学习(六)-Kotlin编程语言-数据类与单例类
假设我们要创建一个表示书籍的数据类 Book
,包含书名和作者两个字段。在 Java 中,代码如下:
public class Book { String title; String author; public Book(String title, String author) { this.title = title; this.author = author; } @Override public boolean equals(Object obj) { if (obj instanceof Book) { Book other = (Book) obj; return other.title.equals(title) && other.author.equals(author); } return false; } @Override public int hashCode() {return title.hashCode() + author.hashCode(); } @Override public String toString() { return "Book(title=" + title + ", author=" + author + ")"; }
}
这段代码虽然实现了所需的功能,但显得相当冗长且缺乏实际逻辑意义。
Kotlin 中的数据类
在 Kotlin 中,我们可以使用 data
关键字来简化这个过程。首先,右击 com.example.helloworld
包 → New → Kotlin File/Class,在弹出的对话框中输入 Book
,选择类型为“Class”。然后编写如下代码:
data class Book(val title: String, val author: String)
只需一行代码即可完成数据类的定义!Kotlin 会自动为我们生成 equals()
、hashCode()
和 toString()
方法。
测试数据类
我们可以在 main
函数中测试这个数据类:
fun main() { val book1 = Book("1984", "George Orwell") val book2 = Book("1984", "George Orwell") println(book1) println("book1 equals book2: ${book1 == book2}")
}
运行上述代码,输出结果如下:
Book(title=1984, author=George Orwell)
book1 equals book2: true
可以看到,Book
数据类已经正常工作了。如果去掉 data
关键字,结果将会完全不同。
单例类
单例模式是一种设计模式,确保一个类在整个应用程序中只有一个实例,并提供一个全局访问点。在 Java 中,实现单例模式通常需要私有化构造函数并提供一个静态方法来获取实例。
Java 中的单例模式
以下是一个典型的 Java 单例模式实现:
public class Library { private static Library instance; private Library() {} public synchronized static Library getInstance() { if (instance == null) {instance = new Library(); } return instance; } public void libraryTest() { System.out.println("libraryTest is called."); }
}
调用单例类中的方法:
Library library = Library.getInstance();
library.libraryTest();
尽管 Java 中的单例模式实现并不复杂,但 Kotlin 提供了更简洁的方式。
Kotlin 中的单例模式
在 Kotlin 中,创建单例类非常简单,只需将 class
关键字改为 object
关键字即可。右击 com.example.helloworld
包 → New → Kotlin File/Class,在弹出的对话框中输入 Library
,选择类型为“Object”,点击“OK”完成创建。初始代码如下所示:
object Library { fun libraryTest() { println("libraryTest is called.") }
}
这样,Library
就已经是一个单例类了。调用单例类中的方法也非常简单:
fun main() {Library.libraryTest()
}
运行上述代码,输出结果如下:
libraryTest is called.
在 Kotlin 中,不需要私有化构造函数,也不需要提供 getInstance()
方法,只需将 class
改为 object
,Kotlin 会自动处理单例的创建和管理。
总结
通过本节的学习,我们掌握了 Kotlin 中数据类和单例类的使用方法。数据类通过 data
关键字简化了常见方法的实现,而单例类通过 object
关键字提供了简洁的单例模式实现。这些特性使得 Kotlin 在面向对象编程方面更加高效和易于维护。
通过这些示例和解释,相信你已经对 Kotlin 中的数据类和单例类有了清晰的认识。实践是检验真理的唯一标准,动手试试吧!
相关文章:
Android学习(六)-Kotlin编程语言-数据类与单例类
假设我们要创建一个表示书籍的数据类 Book,包含书名和作者两个字段。在 Java 中,代码如下: public class Book { String title; String author; public Book(String title, String author) { this.title title; this.author author; } Ove…...

CV-OCR经典论文解读|An Empirical Study of Scaling Law for OCR/OCR 缩放定律的实证研究
论文标题 An Empirical Study of Scaling Law for OCR OCR 缩放定律的实证研究 论文链接: An Empirical Study of Scaling Law for OCR论文下载 论文作者 Miao Rang, Zhenni Bi, Chuanjian Liu, Yunhe Wang, Kai Han 内容简介 本论文在光学字符识别…...
力扣274. H 指数
给你一个整数数组 citations ,其中 citations[i] 表示研究者的第 i 篇论文被引用的次数。计算并返回该研究者的 h 指数。 根据维基百科上 h 指数的定义:h 代表“高引用次数” ,一名科研人员的 h 指数 是指他(她)至少发…...

挑战一个月基本掌握C++(第五天)了解运算符,循环,判断
一 运算符 运算符是一种告诉编译器执行特定的数学或逻辑操作的符号。C 内置了丰富的运算符,并提供了以下类型的运算符: 算术运算符关系运算符逻辑运算符位运算符赋值运算符杂项运算符 1.1 算术运算符 假设变量 A 的值为 10,变量 B 的值为…...

Python的sklearn中的RandomForestRegressor使用详解
文章目录 Python的sklearn中的RandomForestRegressor使用详解一、引言二、RandomForestRegressor简介1、随机森林回归原理2、RandomForestRegressor的主要参数 三、构建和训练模型1、数据准备2、数据划分3、模型训练 四、模型评估1、预测2、评估指标 五、特征重要性分析六、可视…...

ReactPress 1.6.0:重塑博客体验,引领内容创新
ReactPress 是一个基于Next.js的博客&CMS系统, Github项目地址:https://github.com/fecommunity/reactpress 欢迎Star。 体验地址:http://blog.gaoredu.com/ 今天,我们自豪地宣布ReactPress 1.6.0版本的正式发布,…...

人脸生成3d模型 Era3D
从单视图图像进行3D重建是计算机视觉和图形学中的一项基本任务,因为它在游戏设计、虚拟现实和机器人技术中具有潜在的应用价值。早期的研究主要依赖于直接在体素上进行3D回归,这往往会导致过于平滑的结果,并且由于3D训练数据的限制࿰…...
kubeadm搭建k8s集群
前置环境: 准备三台虚拟机 192.168.1.104(用来做k8s的mater节点) 192.168.1.105(节点node2) 192.168.1.109(节点node3) 关闭防火墙 systemctl stop firewalld systemctl disable firewalld安装…...
centOS系统进程管理基础知识
进程的概念与属性 1.进程是系统中正在执行的代码片段,也可以称为一个程序。 2.操作系统通过分配进程编号(PID)来管理进程。 3.进程属性包括PID、PPID、UID、GID、状态、优先级、终端名和资源占用等。 PS命令与进程查看 1.PS命令用于查看进程…...

STM32中ADC模数转换器
一、ADC简介 ADC模拟-数字转换器 ADC可以将引脚连续变化的模拟电压转换为内存中存储的数字变量,建立模拟电路到数字电路的桥梁 12位逐次逼近型ADC,1us转换时间 输入电压范围: 0~3.3V,转换结果范围:0~4095 18个输入…...

初学stm32 --- 外部中断
目录 STM32 IO 口中断基础知识 相关库函数: 使用 IO 口外部中断的一般步骤 STM32 IO 口中断基础知识 STM32 的每个 IO 都可以作为外部中断的中断输入口。STM32F103 的中断控制器支持 19 个外部中断/事件请求。每个中断设有状态位,每个中断/事件都有独立…...
wordpress调用指定分类ID下 相同标签的内容
要在WordPress中调用分类ID为1、3、7的分类下,具有相同标签的前10个内容,可以使用自定义的WordPress查询(WP_Query)。以下是实现此功能的步骤和示例代码: 步骤: 确定共同标签: 首先,你需要确定分类1、3、…...
SQL语法基础知识总结
一、引言 在当今数字化时代,数据的存储和管理至关重要。SQL(Structured Query Language),即结构化查询语言,是用于管理关系型数据库的强大工具。无论是开发 Web 应用、进行数据分析还是处理企业级数据,掌握…...

css 实现呼吸灯效果
先看效果: 动画的结果就想实在呼吸,完整的代码如下: <template><div class"container"><div class"long-breath"></div></div> </template><style lang"less"> html, body{h…...

IMX6ULL开发板如何关掉自带的QT的GUI界面和poky的界面的方法
重要说明:其实最后发现根本没必要去关掉自带的QT的GUI界面,直接把屏幕先刷黑就可以看到测试效果了,把屏蔽先刷黑的代码见博文: https://blog.csdn.net/wenhao_ir/article/details/144594705 不过,既然花了时间摸索如何…...
几种广泛使用的 C++ 编译器
C 编译器有很多种,它们在不同的操作系统和开发环境中提供服务。以下是几种广泛使用的 C 编译器: 1. GCC (GNU Compiler Collection) 平台:跨平台(Linux, macOS, Windows)特点:GCC 是一个自由软件编译器套…...
《Vue进阶教程》第十六课:深入完善响应式系统之单例模式
往期内容: 《Vue进阶教程》第五课:ref()函数详解(重点) 《Vue进阶教程》第六课:computed()函数详解(上) 《Vue进阶教程》第七课:computed()函数详解(下) 《Vue进阶教程》第八课:watch()函数的基本使用 《Vue进阶教…...

C语言版解法力扣题:将整数按权重排序
1.题目描述 我们将整数 x 的 权重 定义为按照下述规则将 x 变成 1 所需要的步数: 如果 x 是偶数,那么 x x / 2 如果 x 是奇数,那么 x 3 * x 1 比方说,x3 的权重为 7 。因为 3 需要 7 步变成 1 (3 --> 10 -->…...

Unity ECS和OOP优劣对比
OOP的优劣 面向对象编程(OOP, Object-Oriented Programming)是一种通过对象及其交互来组织代码的编程范式,广泛应用于软件开发中。以下是OOP的优缺点: 优点 代码可重用性 继承机制:通过继承,子类可以复用…...
【Java基础面试题026】Java中的String、StringBuffer和StringBuilder的区别是什么?
回答重点 他们都是Java中处理字符串的类,区别主要体现在可变性、线程安全和性能上 1)String 不可变:String是不可变类,字符串对象创建,存储在堆中,字符串内容存储在字符串常量池中,一旦创建内…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...

Python实现prophet 理论及参数优化
文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案
随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...
Go 并发编程基础:通道(Channel)的使用
在 Go 中,Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式,用于在多个 Goroutine 之间传递数据,从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...

AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别
【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而,传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案,能够实现大范围覆盖并远程采集数据。尽管具备这些优势…...
第7篇:中间件全链路监控与 SQL 性能分析实践
7.1 章节导读 在构建数据库中间件的过程中,可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中,必须做到: 🔍 追踪每一条 SQL 的生命周期(从入口到数据库执行)&#…...
解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist
现象: android studio报错: [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决: 不要动CMakeLists.…...

STM32---外部32.768K晶振(LSE)无法起振问题
晶振是否起振主要就检查两个1、晶振与MCU是否兼容;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容(CL)与匹配电容(CL1、CL2)的关系 2. 如何选择 CL1 和 CL…...

Python 实现 Web 静态服务器(HTTP 协议)
目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1)下载安装包2)配置环境变量3)安装镜像4)node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1)使用 http-server2)详解 …...