文章目录

  • 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中的单例模式相关推荐

  1. [译]Object的局限性——Kotlin中的带参单例模式

    原文:Kotlin singletons with argument --object has its limits 作者:Christophe Beyls 译者:却把清梅嗅 在Kotlin中,单例模 ...

  2. 教你如何完全解析Kotlin中的注解

    简述: 从这篇文章将继续开始探索Kotlin中的一些高级的内容,之前有着重探讨了Kotlin的泛型以及泛型型变等内容.现在我们一起来看下Kotlin中的注解.Kotlin中的注解是100%与Java注 ...

  3. 教你如何攻克Kotlin中泛型型变的难点(下篇)

    简述: 前几天我们一起为Kotlin中的泛型型变做了一个很好的铺垫,深入分析下类型和类,子类型和子类之间的关系.什么是子类型化关系以及型变存在的意义.那么今天将会讲点更刺激的东西,也就是Kotlin泛 ...

  4. [译]带你揭开Kotlin中属性代理和懒加载语法糖衣

    翻译说明: 原标题: How Kotlin's delegated properties and lazy-initialization work 原文地址: https://medium.com/t ...

  5. [译]Kotlin中是应该使用序列(Sequences)还是集合(Lists)?

    翻译说明: 原标题: Sequences - a Pragmatic Approach 原文地址: https://proandroiddev.com/sequences-a-pragmatic-ap ...

  6. 教你如何攻克Kotlin中泛型型变的难点(应用篇)

    简述: 这是泛型型变最后一篇文章了,也是泛型介绍的最后一篇文章.顺便再扯点别的,上周去北京参加了JetBrains 2018开发者日,主要是参加Kotlin专场.个人感觉收获还是挺多的,bennyHu ...

  7. kotlin中继承父属性使用构造方法

    kotlin中继承父属性使用构造方法 1. 定义父类,给它两个属性: abstract class AbstractResponseMessage {private var success = tru ...

  8. Kotlin 中 switch 写法

    在Kotlin 中并没有switch 操作符 , 取而代之的是when java的写法: int i= 5;switch (i){case 5:System.out.print("5&quo ...

  9. 【C++】C/C++ 中的单例模式

    目录 part 0:单例模式3种经典的实现方式 Meyer's Singleton Meyers Singleton版本二 Lazy Singleton Eager Singleton Testing ...

最新文章

  1. golang中的jwt
  2. React 组件学习
  3. 【自适应(盲)均衡5】分数间隔均衡器基本原理及应用(更正数字通信翻译版中公式错误)
  4. 04.React事件 方法、 React定义方法的几种方式 获取数据 改变数据 执行方法传值...
  5. [译]MediaSession MediaController – Android TV 应用开发教程九
  6. 自学前端不用慌张!零基础自学前端必备手册,学成月薪12K
  7. python棋盘放麦粒求和递归_Python递归调用实现数字累加的代码
  8. php mysql后台管理模板_[开源]TP6后台管理模板
  9. python 爬取有道词典翻译
  10. Li‘s 核磁共振影像数据处理-19-FSL界面可视化操作介绍
  11. 游戏盾能防住几T的攻击吗
  12. repo,git相关命令使用
  13. ImportError: No module named datetime全局python解决time显示问题
  14. Python 正则表达式 match、findall、search
  15. 合宙ESP32S3 CameraWebServe 测试demo
  16. jsp中img显示本地图片
  17. php var的解释
  18. 8051单片机Proteus仿真与开发实例-74LS378触发器驱动仿真
  19. Unity预制体和预设
  20. java 多少位表示一个字_一个字多少个字符

热门文章

  1. ChatGPT 整理的 “Java基础面试题集锦:完全版“ (1)
  2. 人工智能文本分析(AITextAnalysis)
  3. Python OpenCV -- Canny 边缘检测 (十一)
  4. 【Case】result set exceeds the maximum size(100M)
  5. 目测钉钉又又又又走错路了
  6. 振幅整合脑电图aEEG绘制方法
  7. 汉语拼音大全_php_sir_新浪博客
  8. HTML文本框聚焦边框颜色如何不改变
  9. 论熔断机制的下线,最失败的功能规则设计
  10. Python玩转大数据-张敏-专题视频课程