Kotlin中的单例模式
文章目录
- Kotlin中的单例模式
- object 静态代码块单例模式
- 借助委托实现懒加载
- 伴生对象双检查单例模式
- 封装单例模式
- 优化
Kotlin中的单例模式
object 静态代码块单例模式
Kotlin编译器将其转换为静态代码块的单例模式,因为static代码块中的代码,虚拟机只会执行一次,因此,它保证了线程安全的前提下,同时保证我们的INSTANCE只会被初始化一次。
缺点:不支持懒加载,不支持传参。
object Singleton {}
借助委托实现懒加载
保证了懒加载的同时,也保证了线程安全。
object Singleton {val user by lazy {loadUser()}private fun loadUser(): User {return User()}
}
伴生对象双检查单例模式
@Volatiel
确保了INSTANCE的可见性。synchronized
确保了INSTANCE的原子性。
class Singleton private constructor(name: String) {companion object {@Volatileprivate var INSTANCE: Singleton? = nullfun getInstance(name: String): Singleton =INSTANCE ?: synchronized(this) {INSTANCE ?: Singleton(name).also { INSTANCE = it }}}
}
封装单例模式
定义抽象类模板
abstract class BaseSingleton<in P, out T> {@Volatileprivate var INSTANCE: T? = nullprotected abstract fun creator(param: P): Tfun getInstance(param: P): T =INSTANCE ?: synchronized(this) {INSTANCE ?: creator(param).also { INSTANCE = it }}
}
class UserManager private constructor(name: String) {companion object : BaseSingleton<String, UserManager>() {override fun creator(param: String): UserManager {return UserManager(param)}}
}
优化
- 将creator抽象方法修改为高阶函数的类型。
- 使用
::UserManager
函数引用,引用UserManager的构造函数
abstract class BaseSingleton<in P, out T> {@Volatileprivate var INSTANCE: T? = nullprotected abstract val creator: (P) -> Tfun getInstance(param: P): T =INSTANCE ?: synchronized(this) {INSTANCE ?: creator(param).also { INSTANCE = it }}
}
class UserManager private constructor(name: String) {companion object : BaseSingleton<String, UserManager>() {override val creator: (String) -> UserManagerget() = ::UserManager}
}
Kotlin中的单例模式相关推荐
- [译]Object的局限性——Kotlin中的带参单例模式
原文:Kotlin singletons with argument --object has its limits 作者:Christophe Beyls 译者:却把清梅嗅 在Kotlin中,单例模 ...
- 教你如何完全解析Kotlin中的注解
简述: 从这篇文章将继续开始探索Kotlin中的一些高级的内容,之前有着重探讨了Kotlin的泛型以及泛型型变等内容.现在我们一起来看下Kotlin中的注解.Kotlin中的注解是100%与Java注 ...
- 教你如何攻克Kotlin中泛型型变的难点(下篇)
简述: 前几天我们一起为Kotlin中的泛型型变做了一个很好的铺垫,深入分析下类型和类,子类型和子类之间的关系.什么是子类型化关系以及型变存在的意义.那么今天将会讲点更刺激的东西,也就是Kotlin泛 ...
- [译]带你揭开Kotlin中属性代理和懒加载语法糖衣
翻译说明: 原标题: How Kotlin's delegated properties and lazy-initialization work 原文地址: https://medium.com/t ...
- [译]Kotlin中是应该使用序列(Sequences)还是集合(Lists)?
翻译说明: 原标题: Sequences - a Pragmatic Approach 原文地址: https://proandroiddev.com/sequences-a-pragmatic-ap ...
- 教你如何攻克Kotlin中泛型型变的难点(应用篇)
简述: 这是泛型型变最后一篇文章了,也是泛型介绍的最后一篇文章.顺便再扯点别的,上周去北京参加了JetBrains 2018开发者日,主要是参加Kotlin专场.个人感觉收获还是挺多的,bennyHu ...
- kotlin中继承父属性使用构造方法
kotlin中继承父属性使用构造方法 1. 定义父类,给它两个属性: abstract class AbstractResponseMessage {private var success = tru ...
- Kotlin 中 switch 写法
在Kotlin 中并没有switch 操作符 , 取而代之的是when java的写法: int i= 5;switch (i){case 5:System.out.print("5&quo ...
- 【C++】C/C++ 中的单例模式
目录 part 0:单例模式3种经典的实现方式 Meyer's Singleton Meyers Singleton版本二 Lazy Singleton Eager Singleton Testing ...
最新文章
- golang中的jwt
- React 组件学习
- 【自适应(盲)均衡5】分数间隔均衡器基本原理及应用(更正数字通信翻译版中公式错误)
- 04.React事件 方法、 React定义方法的几种方式 获取数据 改变数据 执行方法传值...
- [译]MediaSession MediaController – Android TV 应用开发教程九
- 自学前端不用慌张!零基础自学前端必备手册,学成月薪12K
- python棋盘放麦粒求和递归_Python递归调用实现数字累加的代码
- php mysql后台管理模板_[开源]TP6后台管理模板
- python 爬取有道词典翻译
- Li‘s 核磁共振影像数据处理-19-FSL界面可视化操作介绍
- 游戏盾能防住几T的攻击吗
- repo,git相关命令使用
- ImportError: No module named datetime全局python解决time显示问题
- Python 正则表达式 match、findall、search
- 合宙ESP32S3 CameraWebServe 测试demo
- jsp中img显示本地图片
- php var的解释
- 8051单片机Proteus仿真与开发实例-74LS378触发器驱动仿真
- Unity预制体和预设
- java 多少位表示一个字_一个字多少个字符
热门文章
- ChatGPT 整理的 “Java基础面试题集锦:完全版“ (1)
- 人工智能文本分析(AITextAnalysis)
- Python OpenCV -- Canny 边缘检测 (十一)
- 【Case】result set exceeds the maximum size(100M)
- 目测钉钉又又又又走错路了
- 振幅整合脑电图aEEG绘制方法
- 汉语拼音大全_php_sir_新浪博客
- HTML文本框聚焦边框颜色如何不改变
- 论熔断机制的下线,最失败的功能规则设计
- Python玩转大数据-张敏-专题视频课程