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

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 内容简介 本论文在光学字符识别&#xf…...

力扣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训练数据的限制&#xff0…...

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 实现呼吸灯效果

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

IMX6ULL开发板如何关掉自带的QT的GUI界面和poky的界面的方法

重要说明&#xff1a;其实最后发现根本没必要去关掉自带的QT的GUI界面&#xff0c;直接把屏幕先刷黑就可以看到测试效果了&#xff0c;把屏蔽先刷黑的代码见博文&#xff1a; https://blog.csdn.net/wenhao_ir/article/details/144594705 不过&#xff0c;既然花了时间摸索如何…...

几种广泛使用的 C++ 编译器

C 编译器有很多种&#xff0c;它们在不同的操作系统和开发环境中提供服务。以下是几种广泛使用的 C 编译器&#xff1a; 1. GCC (GNU Compiler Collection) 平台&#xff1a;跨平台&#xff08;Linux, macOS, Windows&#xff09;特点&#xff1a;GCC 是一个自由软件编译器套…...

《Vue进阶教程》第十六课:深入完善响应式系统之单例模式

往期内容&#xff1a; 《Vue进阶教程》第五课&#xff1a;ref()函数详解(重点) 《Vue进阶教程》第六课&#xff1a;computed()函数详解(上) 《Vue进阶教程》第七课&#xff1a;computed()函数详解(下) 《Vue进阶教程》第八课&#xff1a;watch()函数的基本使用 《Vue进阶教…...

C语言版解法力扣题:将整数按权重排序

1.题目描述 我们将整数 x 的 权重 定义为按照下述规则将 x 变成 1 所需要的步数&#xff1a; 如果 x 是偶数&#xff0c;那么 x x / 2 如果 x 是奇数&#xff0c;那么 x 3 * x 1 比方说&#xff0c;x3 的权重为 7 。因为 3 需要 7 步变成 1 &#xff08;3 --> 10 -->…...

Unity ECS和OOP优劣对比

OOP的优劣 面向对象编程&#xff08;OOP, Object-Oriented Programming&#xff09;是一种通过对象及其交互来组织代码的编程范式&#xff0c;广泛应用于软件开发中。以下是OOP的优缺点&#xff1a; 优点 代码可重用性 继承机制&#xff1a;通过继承&#xff0c;子类可以复用…...

【Java基础面试题026】Java中的String、StringBuffer和StringBuilder的区别是什么?

回答重点 他们都是Java中处理字符串的类&#xff0c;区别主要体现在可变性、线程安全和性能上 1&#xff09;String 不可变&#xff1a;String是不可变类&#xff0c;字符串对象创建&#xff0c;存储在堆中&#xff0c;字符串内容存储在字符串常量池中&#xff0c;一旦创建内…...

docker详细操作--未完待续

docker介绍 docker官网: Docker&#xff1a;加速容器应用程序开发 harbor官网&#xff1a;Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台&#xff0c;用于将应用程序及其依赖项&#xff08;如库、运行时环…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练

前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1)&#xff1a;从基础到实战的深度解析-CSDN博客&#xff0c;但实际面试中&#xff0c;企业更关注候选人对复杂场景的应对能力&#xff08;如多设备并发扫描、低功耗与高发现率的平衡&#xff09;和前沿技术的…...

2021-03-15 iview一些问题

1.iview 在使用tree组件时&#xff0c;发现没有set类的方法&#xff0c;只有get&#xff0c;那么要改变tree值&#xff0c;只能遍历treeData&#xff0c;递归修改treeData的checked&#xff0c;发现无法更改&#xff0c;原因在于check模式下&#xff0c;子元素的勾选状态跟父节…...

HBuilderX安装(uni-app和小程序开发)

下载HBuilderX 访问官方网站&#xff1a;https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本&#xff1a; Windows版&#xff08;推荐下载标准版&#xff09; Windows系统安装步骤 运行安装程序&#xff1a; 双击下载的.exe安装文件 如果出现安全提示&…...

C# 类和继承(抽象类)

抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

Spring AI与Spring Modulith核心技术解析

Spring AI核心架构解析 Spring AI&#xff08;https://spring.io/projects/spring-ai&#xff09;作为Spring生态中的AI集成框架&#xff0c;其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似&#xff0c;但特别为多语…...

HashMap中的put方法执行流程(流程图)

1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中&#xff0c;其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下&#xff1a; 初始判断与哈希计算&#xff1a; 首先&#xff0c;putVal 方法会检查当前的 table&#xff08;也就…...

面向无人机海岸带生态系统监测的语义分割基准数据集

描述&#xff1a;海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而&#xff0c;目前该领域仍面临一个挑战&#xff0c;即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...

群晖NAS如何在虚拟机创建飞牛NAS

套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...

【前端异常】JavaScript错误处理:分析 Uncaught (in promise) error

在前端开发中&#xff0c;JavaScript 异常是不可避免的。随着现代前端应用越来越多地使用异步操作&#xff08;如 Promise、async/await 等&#xff09;&#xff0c;开发者常常会遇到 Uncaught (in promise) error 错误。这个错误是由于未正确处理 Promise 的拒绝&#xff08;r…...