转载请标明出处:https://blog.csdn.net/zhaoyanjun6/article/details/87941461
本文出自【赵彦军的博客】


单例模式

  • 无参单例模式—线程安全
  • 懒加载单例模式—线程安全
  • 有参单例模式—线程安全

无参单例模式—线程安全

在 Java 中单例模式有很多种写法,比如懒汉模式,恶汉模式。但是在 Kotlin 种的单例模式就简单很多,用 object 修饰的类就是单例。

object User {var name: String? = nullfun run() {}
}

你们看,是不是简单很多,我们把 kotlin 编译成 java 代码来看看

public final class User {@Nullableprivate static String name;public static final User INSTANCE;@Nullablepublic final String getName() {return name;}public final void setName(@Nullable String var1) {name = var1;}public final void run() {}static {User var0 = new User();INSTANCE = var0;}
}

可以看到 User 类中有 INSTANCE 实例,用 static 静态代码块包裹,在第一次使用的时候初始化。

那么这个单例模式怎么使用呢?

在 kotlin 中使用

User.name = "赵彦军"    //调用成员变量
User.run()    //调用成员函数

在 Java 中使用也很简单,但是不能像 kotlin 中那些直接调用,需要加一个 INSTANCE

//调用成员变量
User.INSTANCE.setName("zhaoyanjun");
User.INSTANCE.getName();//调用成员函数
User.INSTANCE.run();

懒加载单例模式—线程安全

class Manager private constructor() {companion object {val instance by lazy {Manager()}}fun run() {//running now }
}

使用方式

//kotlin 版本
Manager.instance.run()//java版本
Manager.Companion.getInstance().run();

有参单例模式—线程安全

首先创建单例模式工具类 SingletonHolder

open class SingletonHolder<out T: Any, in A>(creator: (A) -> T) {private var creator: ((A) -> T)? = creator@Volatile private var instance: T? = nullfun getInstance(arg: A): T {val i = instanceif (i != null) {return i}return synchronized(this) {val i2 = instanceif (i2 != null) {i2} else {val created = creator!!(arg)instance = createdcreator = nullcreated}}}
}

然后创建单例模式实体类

import android.content.Contextclass Manager private constructor(context: Context) {init {// Init using context argument}companion object : SingletonHolder<Manager, Context>(::Manager)fun run() {//running now }
}

使用方式

//kotlin 版本
Manager.getInstance(baseContext).run()//java版本Manager.Companion.getInstance(context).run();

反编译代码

import android.content.Context;
import kotlin.Metadata;
import kotlin.jvm.functions.Function1;
import kotlin.jvm.internal.DefaultConstructorMarker;
public final class Manager {public static final Manager.Companion Companion = new Manager.Companion((DefaultConstructorMarker)null);public final void run() {}private Manager(Context context) {}// $FF: synthetic methodpublic Manager(Context context, DefaultConstructorMarker $constructor_marker) {this(context);}public static final class Companion extends SingletonHolder {private Companion() {super((Function1)null.INSTANCE);}// $FF: synthetic methodpublic Companion(DefaultConstructorMarker $constructor_marker) {this();}}
}

个人微信号:zhaoyanjun125 , 欢迎关注

Kotlin实战指南七:单例模式相关推荐

  1. Kotlin实战指南二十:flow

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/117370700 本文出自[赵彦军的博客] 文章目录 往期精彩文章 flow 是啥 ...

  2. Kotlin实战指南十九:use 函数魔法

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/117366756 本文出自[赵彦军的博客] 文章目录 往期精彩文章 use函数 往期 ...

  3. Kotlin实战指南十八:open、internal 关键字使用

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/117365712 本文出自[赵彦军的博客] 文章目录 往期精彩文章 open关键字 ...

  4. Kotlin实战指南十七:JvmField、JvmStatic使用

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/116668666 本文出自[赵彦军的博客] 文章目录 往期精彩文章 @JvmFiel ...

  5. Kotlin实战指南十:let、apply、with、run

    转载请标明出处:https://blog.csdn.net/zhaoyanjun6/article/details//94402604 本文出自[赵彦军的博客] 文章目录 let 示例1:基础用法 示 ...

  6. Kotlin实战指南十六:Synchronized、Volatile

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/116267707 本文出自[赵彦军的博客] 文章目录 如何创建线程 Thread 如 ...

  7. Kotlin实战指南十四:协程启动模式

    转载请标明出处:https://blog.csdn.net/zhaoyanjun6/article/details/96008400 本文出自[赵彦军的博客] 文章目录 协程启动 DEFAULT LA ...

  8. Kotlin实战指南十三:协程

    转载请标明出处:https://blog.csdn.net/zhaoyanjun6/article/details/95626034 本文出自[赵彦军的博客] 文章目录 前言-协程介绍 主流语言对协程 ...

  9. Kotlin实战指南十二:data class

    转载请标明出处:https://blog.csdn.net/zhaoyanjun6/article/details/94649274 本文出自[赵彦军的博客] 文章目录 前言 正文 toString( ...

最新文章

  1. 《JAVA与模式》之备忘录模式
  2. sql 游标_SQL基础丨游标
  3. html代码复制到asp中不一样了_迷你代码编程在线成语词典
  4. 【APUE】文件 I/O 操作
  5. [VN2020 公开赛]CSRe
  6. event loop那些事儿
  7. java 单例 实现_java 实现单例的各种方式
  8. 用过C#的朋友可能认为它是一种十分安全的语言,其实C#也可以做到经典的缓冲区溢出。 本文章将用一个实例来描述C#究竟是如何发生缓冲区溢出的! 首先建立一个C# Console工程,并开启工程的“允许
  9. v8引擎和v12引擎_为什么V8和V12发动机至今还存在,而V10发动机却早早被淘汰了?...
  10. vs vue 查看webpack安装成功_在Vue+webpack中详细讲解基础配置
  11. Windows服务器上使用phpstudy部署PHP程序
  12. windows下创建目录函数_mkdir
  13. 安装了Python2.X和Python3.X后Python2.X IDLE打不开解决办法总结
  14. C#汉字转拼音的实现方法
  15. python身份证区域分割_python 身份证归属地解析
  16. 用makedown写一份简约大方的简历
  17. 【BP回归预测】基于matlab鲸鱼算法优化BP神经网络回归预测(多输入单输出)【含Matlab源码 1554期】
  18. 电路中的输入输出阻抗以及阻抗匹配
  19. 【学习笔记】monitor
  20. 做网站推广最实用的88种网站推广方法

热门文章

  1. c语言由高到低的运算符,求解C语言关系运算符优先极由高到低列表(同级请用括号)...
  2. mac homebrew装mysql_mac系统homebrew安装mysql
  3. java json的使用方法_JAVA编写JSON常用的三种方法
  4. 三、ResNet50预置算法提高美食分类识别精确度
  5. 四十九、IQ 与测试评分案例
  6. 衡量时间序列相似度的方法:从欧氏距离到DTW及其变种
  7. ACM MM 2020视频目标检测挑战赛冠军DeepBlueAI团队技术分享
  8. 直播预告 | 高效视频理解模型的设计及ICCV比赛冠军方案解读
  9. Designing GANs:又一个GAN生产车间
  10. ECCV 2018 | 腾讯AI Lab提出视频再定位任务,准确定位相关视频内容