网站首页 > 博客文章 正文
Singleton:
Singleton是一种软件设计模式,可以确保一个类仅具有一个实例,并且该类提供了对其的全局访问点。单例模式可确保仅创建一个实例,并将其用作单个访问点,从而确保线程安全。
在Java代码中,它将如下所示:
public class Singleton { private static Singleton instance; private Singleton() { } public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } }
但是以上代码很危险,尤其是在不同线程中使用时。如果两个线程一次访问此单例,则可能生成该对象的两个实例。
class Singleton { private static Singleton instance = null; private Singleton() { } private synchronized static void createInstance() { if (instance == null) { instance = new Singleton(); } } public static Singleton getInstance() { if (instance == null) createInstance(); return instance; } }
该synchronized关键字确保了创建实例时没有线程的干扰。
如果您想在Kotlin中重新创建它,那么接近它的代码将是:
class Singleton private constructor() { private object HOLDER { val INSTANCE = Singleton() } companion object { val instance: Singleton by lazy { HOLDER.INSTANCE } } }
在这种情况下,The by lazy{}表示将仅在首次访问时进行计算。lazy属性的评估是synchronized,仅在一个线程中计算值,并且所有线程将看到相同的值。
Kotlin具有上述要求的默认实现,即
object Singleton
是啊!而已。只需一行代码,您就可以避免所有这些代码行。object是具有线程安全单例实现的数据类型。
对象声明
object DataProviderManager { fun registerDataProvider(provider: DataProvider) { // ... } val allDataProviders: Collection<DataProvider> get() = // ... }
就像变量声明一样,对象声明也不是表达式,并且不能在赋值语句的右侧使用。对象声明的初始化是线程安全的。
要引用该对象,我们直接使用其名称。
DataProviderManager.registerDataProvider(...)
对象可以具有超类型:
object DefaultListener : MouseAdapter() { override fun mouseClicked(e: MouseEvent) { ... } override fun mouseEntered(e: MouseEvent) { ... } }
总结:
- Kotlin对Singleton类的表示object仅需要关键字。
- 一个object类可以包含属性,函数和init方法。
- 不允许使用构造方法。
- 不能以实例化类的方式实例化对象。
- 首次使用对象进行延迟初始化时,将实例化该对象。
- Object 声明的初始化是线程安全的。
翻译自:https://medium.com/swlh/singleton-class-in-kotlin-c3398e7fd76b
猜你喜欢
- 2024-09-29 直击灵魂一问:协程到底是怎么切换线程的?
- 2024-09-29 八月冲刺别毁在传统一问一答模式,这份面试准备助你事半功倍
- 2024-09-29 Kotlin遇见数据结构丨说说顺序存储的二叉树如何创建遍历
- 2024-09-29 Kotlin实战—使用Room封装本地数据层
- 2024-09-29 知了堂|MybatisPlus—kotlin代码生成
- 2024-09-29 竟然有5种微服务框架可以替代Spring Boot
- 2024-09-29 ViewBinding 与 Kotlin 委托双剑合璧
- 2024-09-29 Kotlin编写一个GIFDialog 在线音视频解析三
- 2024-09-29 Kotlin+SpringBoot+Redis+Lua实现限流访问控制详解
- 2024-09-29 北上广程序员回重庆继续代码 kotlin音视频解析六 收藏
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- ifneq (61)
- 字符串长度在线 (61)
- messagesource (56)
- aspose.pdf破解版 (56)
- promise.race (63)
- 2019cad序列号和密钥激活码 (62)
- window.performance (66)
- qt删除文件夹 (72)
- mysqlcaching_sha2_password (64)
- ubuntu升级gcc (58)
- nacos启动失败 (64)
- ssh-add (70)
- jwt漏洞 (58)
- macos14下载 (58)
- yarnnode (62)
- abstractqueuedsynchronizer (64)
- source~/.bashrc没有那个文件或目录 (65)
- springboot整合activiti工作流 (70)
- jmeter插件下载 (61)
- 抓包分析 (60)
- idea创建mavenweb项目 (65)
- vue回到顶部 (57)
- qcombobox样式表 (68)
- tomcatundertow (58)
- pastemac (61)
本文暂时没有评论,来添加一个吧(●'◡'●)