Kotlin实战指南七:单例模式
转载请标明出处: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实战指南七:单例模式相关推荐
- Kotlin实战指南二十:flow
转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/117370700 本文出自[赵彦军的博客] 文章目录 往期精彩文章 flow 是啥 ...
- Kotlin实战指南十九:use 函数魔法
转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/117366756 本文出自[赵彦军的博客] 文章目录 往期精彩文章 use函数 往期 ...
- Kotlin实战指南十八:open、internal 关键字使用
转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/117365712 本文出自[赵彦军的博客] 文章目录 往期精彩文章 open关键字 ...
- Kotlin实战指南十七:JvmField、JvmStatic使用
转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/116668666 本文出自[赵彦军的博客] 文章目录 往期精彩文章 @JvmFiel ...
- Kotlin实战指南十:let、apply、with、run
转载请标明出处:https://blog.csdn.net/zhaoyanjun6/article/details//94402604 本文出自[赵彦军的博客] 文章目录 let 示例1:基础用法 示 ...
- Kotlin实战指南十六:Synchronized、Volatile
转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/116267707 本文出自[赵彦军的博客] 文章目录 如何创建线程 Thread 如 ...
- Kotlin实战指南十四:协程启动模式
转载请标明出处:https://blog.csdn.net/zhaoyanjun6/article/details/96008400 本文出自[赵彦军的博客] 文章目录 协程启动 DEFAULT LA ...
- Kotlin实战指南十三:协程
转载请标明出处:https://blog.csdn.net/zhaoyanjun6/article/details/95626034 本文出自[赵彦军的博客] 文章目录 前言-协程介绍 主流语言对协程 ...
- Kotlin实战指南十二:data class
转载请标明出处:https://blog.csdn.net/zhaoyanjun6/article/details/94649274 本文出自[赵彦军的博客] 文章目录 前言 正文 toString( ...
最新文章
- 《JAVA与模式》之备忘录模式
- sql 游标_SQL基础丨游标
- html代码复制到asp中不一样了_迷你代码编程在线成语词典
- 【APUE】文件 I/O 操作
- [VN2020 公开赛]CSRe
- event loop那些事儿
- java 单例 实现_java 实现单例的各种方式
- 用过C#的朋友可能认为它是一种十分安全的语言,其实C#也可以做到经典的缓冲区溢出。 本文章将用一个实例来描述C#究竟是如何发生缓冲区溢出的! 首先建立一个C# Console工程,并开启工程的“允许
- v8引擎和v12引擎_为什么V8和V12发动机至今还存在,而V10发动机却早早被淘汰了?...
- vs vue 查看webpack安装成功_在Vue+webpack中详细讲解基础配置
- Windows服务器上使用phpstudy部署PHP程序
- windows下创建目录函数_mkdir
- 安装了Python2.X和Python3.X后Python2.X IDLE打不开解决办法总结
- C#汉字转拼音的实现方法
- python身份证区域分割_python 身份证归属地解析
- 用makedown写一份简约大方的简历
- 【BP回归预测】基于matlab鲸鱼算法优化BP神经网络回归预测(多输入单输出)【含Matlab源码 1554期】
- 电路中的输入输出阻抗以及阻抗匹配
- 【学习笔记】monitor
- 做网站推广最实用的88种网站推广方法
热门文章
- c语言由高到低的运算符,求解C语言关系运算符优先极由高到低列表(同级请用括号)...
- mac homebrew装mysql_mac系统homebrew安装mysql
- java json的使用方法_JAVA编写JSON常用的三种方法
- 三、ResNet50预置算法提高美食分类识别精确度
- 四十九、IQ 与测试评分案例
- 衡量时间序列相似度的方法:从欧氏距离到DTW及其变种
- ACM MM 2020视频目标检测挑战赛冠军DeepBlueAI团队技术分享
- 直播预告 | 高效视频理解模型的设计及ICCV比赛冠军方案解读
- Designing GANs:又一个GAN生产车间
- ECCV 2018 | 腾讯AI Lab提出视频再定位任务,准确定位相关视频内容