当前位置: 首页 > news >正文

Java 和 Kotlin 单例模式写法对比

目录

1、饿汉模式

Java 写法:

Kotlin 写法:

Kotlin 这段代码反编译&简化后如下:

2、懒汉模式,静态同步方法

Java 写法:

Kotlin 写法:

Kotlin 这段代码反编译&简化后如下:

3、懒汉模式,双重检查 + 同步代码块

Java 写法:

Kotlin 写法:

Kotlin 这段代码反编译&简化后如下:

4、枚举方式

Java 写法:

Kotlin 写法:

5、静态内部类 + 静态代码块

Java 写法:

Kotlin 写法之一:

Kotlin 这段代码反编译&简化后 如下:

6、其他写法

Java 的一种写法:

Kotlin 的一种写法:


1、饿汉模式

Java 写法:

public class SingletonDemo1 {private static SingletonDemo1 INSTANCE = new SingletonDemo1();private SingletonDemo1() {}public static SingletonDemo1 getInstance() {return INSTANCE;}}

Kotlin 写法:

object SingletonDemo1 {}

Kotlin 这段代码反编译&简化后如下:

public final class SingletonDemo1 {@NotNullpublic static final SingletonDemo1 INSTANCE = new SingletonDemo1();private SingletonDemo1() {}
}

2、懒汉模式,静态同步方法

Java 写法:

public class SingletonDemo2 {private volatile static SingletonDemo2 INSTANCE;private SingletonDemo2() {}public synchronized static SingletonDemo2 getInstance() {if (INSTANCE == null) {INSTANCE = new SingletonDemo2();}return INSTANCE;}}

Kotlin 写法:

class SingletonDemo2 private constructor() {companion object {private var INSTANCE: SingletonDemo2? = nullget() {if (field == null) {field = SingletonDemo2()}return field}@Synchronizedfun get(): SingletonDemo2 {return INSTANCE!!}}}

Kotlin 这段代码反编译&简化后如下:

public final class SingletonDemo2 {@NotNullpublic static final Companion Companion = new Companion();private static SingletonDemo2 INSTANCE;private SingletonDemo2() {}public static final class Companion {private Companion() {}@NotNullpublic final synchronized SingletonDemo2 get() {if (SingletonDemo2.INSTANCE == null) {SingletonDemo2.INSTANCE = new SingletonDemo2();}return SingletonDemo2.INSTANCE;}}public static void main(String[] args) {//调用方式SingletonDemo2 sd = SingletonDemo2.Companion.get();}
}

3、懒汉模式,双重检查 + 同步代码块

Java 写法:

public class SingletonDemo3 {private volatile static SingletonDemo3 INSTANCE;private SingletonDemo3() {}public static SingletonDemo3 getInstance() {if (INSTANCE == null) {synchronized (SingletonDemo3.class) {if (INSTANCE == null) {INSTANCE = new SingletonDemo3();}}}return INSTANCE;}}

Kotlin 写法:

这段代码涉及到高阶函数和属性委托。

Lazy 内部实现类中包含了双重判断和同步锁代码块。

class SingletonDemo3 private constructor() {companion object {val INSTANCE: SingletonDemo3 by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) {SingletonDemo3()}}}

Kotlin 这段代码反编译&简化后如下:

public final class SingletonDemo2 {@NotNullpublic static final SingletonDemo2.Companion Companion = new SingletonDemo2.Companion();@NotNullprivate static final Lazy INSTANCE$delegate;private SingletonDemo2() {}static {INSTANCE$delegate = LazyKt.lazy(LazyThreadSafetyMode.SYNCHRONIZED, (Function0)null.INSTANCE);}public static final class Companion {private Companion() {}@NotNullpublic final SingletonDemo2 getINSTANCE() {Lazy var1 = SingletonDemo2.INSTANCE$delegate;Object var2 = null;return (SingletonDemo2)var1.getValue();}}
}

4、枚举方式

Java 写法:

public enum SingletonDemo4 {INSTANCE;public void otherMethod() {}}

Kotlin 写法:

enum class SingletonDemo4 {INSTANCE;fun otherMethod() {}
}

枚举就不反编译了,没什么区别。

5、静态内部类 + 静态代码块

Java 写法:

public class SingletonDemo5 {private static class SingletonHolder {private static final SingletonDemo5 INSTANCE = new SingletonDemo5();}private SingletonDemo5() {}public static final SingletonDemo5 getInstance() {return SingletonHolder.INSTANCE;}}

Kotlin 写法之一:

class SingletonDemo5 private constructor() {companion object {val INSTANCE = SingletonHolder.holder}private object SingletonHolder {val holder = SingletonDemo5()}}

Kotlin 这段代码反编译&简化后 如下:

public final class SingletonDemo100 {@NotNullpublic static final SingletonDemo100.Companion Companion = new SingletonDemo100.Companion();@NotNullprivate static final SingletonDemo100 INSTANCE;private SingletonDemo100() {}static {INSTANCE = SingletonDemo100.SingletonHolder.INSTANCE.getHolder();}public static final class Companion {private Companion() {}@NotNullpublic final SingletonDemo100 getINSTANCE() {return SingletonDemo100.INSTANCE;}}private static final class SingletonHolder {@NotNullpublic static final SingletonDemo100.SingletonHolder INSTANCE = new SingletonDemo100.SingletonHolder();@NotNullprivate static final SingletonDemo100 holder = new SingletonDemo100();@NotNullpublic final SingletonDemo100 getHolder() {return holder;}}
}

6、其他写法

Java 的一种写法:

通过静态代码块方式,借助虚拟机在类加载时创建对象。

public class SingletonDemo6 {private volatile static SingletonDemo6 INSTANCE;static {INSTANCE = new SingletonDemo6();}private SingletonDemo6() {}public static SingletonDemo6 getInstance() {return INSTANCE;}}

Kotlin 的一种写法:

网上看别人写的,有创意,但是也很奇怪,无法完整反编译。

class SingletonDemo10 private constructor(private val property: Int) {companion object {@Volatileprivate var INSTANCE: SingletonDemo10? = nullfun getInstance(property: Int): SingletonDemo10 {return INSTANCE ?: synchronized(this) {INSTANCE ?: SingletonDemo10(property).also { INSTANCE = it }}}}}

http://www.lryc.cn/news/386657.html

相关文章:

  • 解析connectionReset异常的原因与解决方案
  • mindspore打卡第9天 transformer的encoder和decoder部分
  • Python实现IPv4地址和16进制互相转换
  • 计算机视觉 | 基于图像处理和边缘检测算法的黄豆计数实验
  • 深入分析 Android BroadcastReceiver (七)
  • C++中的数据结构
  • 武汉星起航:一站式服务,助力亚马逊卖家高效运营,实现收益飞跃
  • 从灵感到实践:Kimi辅助完成学术论文选题的文艺之旅
  • 华为od-C卷200分题目4 -电脑病毒感染
  • show-overflow-tooltip 解决elementui el-table标签自动换行的问题
  • 数字社交的领航者:解析Facebook的引领作用
  • 深度分析 Apache Flink 窗口机制
  • ubuntu 软链接(ubuntu20.04)
  • 如何在LabVIEW中使用FPGA模块
  • FPGA开发技能(7)Vivado设置bit文件加密
  • 【算法专题--链表】旋转链表 -- 高频面试题(图文详解,小白一看就懂!!)
  • ElasticSearch 和 MySQL的区别
  • Linux部署wordpress站点
  • 实体零售连锁企业如何通过物流接口实现数智化转型升级?
  • AWS EKS上GPU工作负载自动扩缩容的异常排查指南
  • Pytest+Allure+Yaml+Jenkins+Gitlab接口自动化中Jenkins配置
  • 应用及安全
  • 字节流和字符流的相关知识
  • LLM意图识别器实践
  • 常见的反爬手段和解决思路(爬虫与反爬虫)
  • Stable Diffusion【真人模型】:人像光影摄影极限写实真实感大模型
  • java实现图片添加水印
  • CSS规则——font-face
  • 【单片机毕业设计选题24034】-基于STM32的手机智能充电系统
  • [C++][数据结构][图][中][图的遍历][最小生成树]详细讲解