
Kotlin中数据类和单例类的实现和讲解
发布日期:2021-05-06 00:55:42
浏览次数:22
分类:精选文章
本文共 2865 字,大约阅读时间需要 9 分钟。
1. 数据类和单例类
在开始学习之前, 先来学习一下Kotlin语言中的可见性修饰符:熟悉Java的人都知道, Java中有4种可见性修饰符, public、private、protected、default。 kotlin种也有4种,分别是public、private、protected、internal。首先private修饰符和Java是一模一样的,都表示只对当前类的内部可以见。public修饰符虽然作用和Java是一样的,但在Kotlin种public修饰符是默认选项,而在Java中default才是默认的权限修饰符。
修饰符 | Java | Kotlin |
---|---|---|
public | 所有类可见 | 所有类可见(默认) |
private | 当前类可见 | 当前类可见 |
protected | 当前类, 子类, 同一包路径下的类可见 | 当前类, 子类可见 |
default | 同一包路径下的类可见(默认) | 无 |
internal | 无 | 同一模块中类可见 |
1.1数据类
在一个规范的系统架构中,数据类占有着非常重要的角色,他们用于将服务器端或者将数据库中的数据映射到内存中,为编程提供数据模型的支持。或许你听过MVC、MVP、MVVM、之类的架构模式,但不管是哪一种架构模式,这里的M都是指的数据类。数据类通常需要重写equals(), hashCode(), toString()这几个方法,其中equals()方法用于判断两个数据类是否相等, hashCode()作为equals()方法的配套方法, 也需要一起重写, 否则会导致HashMap, HashSet等hash相关的系统类无法正常工作.toString()方法用于更清晰的输入日志. 这里我们来定义一个手机类(先用java代码实现):
public class Phone { private String brand; private double price; public Phone() { } public Phone(String brand, double price) { this.brand = brand; this.price = price; } @Override public int hashCode() { return super.hashCode(); } @Override public boolean equals(@Nullable Object obj) { return super.equals(obj); } @Override public String toString() { return "Phone{" + "brand='" + brand + '\'' + ", price=" + price + '}'; }}
看上去比较复杂吧, 关键是这些代码还没有实际逻辑的意义, 只是为了让它用于数据类的功能而已,而在Kotlin语言中, 可以用data关键字来简化这些代码:
data class Phone(val brand: String, var price: Double)
是的,你没有看错,只需要这一行代码就实现了,当你在一个类前面加了data关键字,就表明你希望这个类是一个数据类,Kotlin会根据主构造函数中的参数帮你将equals(), hashCode(), toString()等固定且无实际逻辑意义的方法自动生成, 从而减少开发的工作量.当一个类中没有任何代码时,可以省去尾部的大括号
测试代码:
fun main() { val phone1 = Phone("Samsung", 2999.9) val phone2 = Phone("Samsung", 2999.9) println("phone1 = phone2 ? " + (phone1 == phone2))}
运行结果:

1.2 单例类
首先先来介绍单例模式:
单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的类一个类只有一个实例。即一个类只有一个对象实例这里用Java来写一个单例类:
public class Singleton { private static Singleton instance; private Singleton() { } public synchronized static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } public void singletonTest() { System.out.println("SingletonTest is called."); }}
这段代码其实很好理解, 首先用private将Singleton的构造函数私有化, 使得外部不可以创建这个类的具体实例.getInstance()方法用于外部获取Singleton类的实例,singletonTest()是上面单例类的一个方法
代码讲解:
public static void main(String[] args) { // 获取 单例类 Singleton 的实例 Singleton singleton =Singleton.getInstance();// 调用单例类Singleton 的 singletonTest()方法 singleton.singletonTest(); }
虽然Java中单例类的实现并不复杂, 但是Kotlin做的更好, 它将一些固定的, 重复的逻辑实现隐藏了起来, 只暴露给我们最简单方便的用法.在Kotlin中创建单例类的方式为, 将class关键字改成object关键字.
代码实现:
object Singleton { }
如果我们要在这个类中编写其他的函数, 直接加上去就好
代码实现:
object Singleton { fun singletonTest() { println("SingletonTest is called."); }}
发表评论
最新留言
能坚持,总会有不一样的收获!
[***.219.124.196]2025年04月16日 03时18分08秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
apache虚拟主机配置
2021-05-09
光盘作为yum源
2021-05-09
PHP 正则表达式资料
2021-05-09
PHP官方网站及PHP手册
2021-05-09
mcrypt加密以及解密过程
2021-05-09
mysql连续聚合
2021-05-09
go等待N个线程完成操作总结
2021-05-09
消息队列 RocketMQ 并发量十万级
2021-05-09
ReactJs入门教程-精华版
2021-05-09
乐观锁悲观锁应用
2021-05-09
.net Core 使用IHttpClientFactory请求
2021-05-09
多线程之旅(准备阶段)
2021-05-09
Python 之网络式编程
2021-05-09
MySql5.5安装步骤及MySql_Front视图配置
2021-05-09
mybatis #{}和${}区别
2021-05-09
Java Objects工具类重点方法使用
2021-05-09
Java内存模型(JMM)
2021-05-09
AQS相关
2021-05-09