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.mzph.cn/bicheng/32155.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Node.js 渲染三维模型并导出为图片

Node.js 渲染三维模型并导出为图片 1. 前言 本文将介绍如何在 Node.js 中使用 Three.js 进行 3D 模型渲染。通过结合 gl 和 canvas 这两个主要依赖库,我们能够在服务器端实现高效的 3D 渲染。这个方法解决了在服务器端生成和处理 3D 图形的需求,使得可…

【mysql】常用操作:维护用户/开启远程/忘记密码/常用命令

一、维护用户 1.1 创建用户 -- 语法 > CREATE USER [username][host] IDENTIFIED BY [password];-- 例子: -- 添加用户user007,密码123456,并且只能在本地可以登录 > CREATE USER user007localhost IDENTIFIED BY 123456; -- 添加用户…

一文搞懂Linux信号【下】

目录 🚩引言 🚩阻塞信号 🚩信号保存 🚩信号捕捉 🚩操作信号集 1.信号集操作函数 2.其它操作函数 🚩总结: 🚩引言 在观看本博客之前,建议大家先看一文搞懂Linux信…

Mysql 分表存储、多段存储

分表存储 分表存储是一种常用的数据库优化技术,特别是当单一表中的数据量非常大时。分表可以帮助提高查询性能、简化数据管理,并优化备份过程。以下是分表存储的一些常见策略和步骤: 1. 选择分表策略 分表可以基于多种策略,常见…

大火《与凤行》演员片酬曝光!网友:难以置信......

近日,大火的《与凤行》演员片酬被网友曝光:女主赵丽颖2000万,男主林更新1200万,而最让人意外的则是辣目洋子,个人片酬高达800万,但是其在剧中戏份比较低,不少网友感叹:难以置信&…

Star、Star求Star

本章是介绍博主自己的一个小工具的。使用的PythonPyQt5开发的。顺带来求一波star🌟🌟!!! 地址:https://gitee.com/qinganan_admin/PyCom Pycom是博主开发的串口工具,要是说对比其他串口工具&…

IOS Swift 从入门到精通: 可选项、展开和类型转换

文章目录 处理缺失数据展开可选值用保护装置解开强制展开隐式解包可选值零合并可选链式调用可选尝试可失败的初始化器类型转换总结 处理缺失数据 我们已经使用诸如 之类的类型Int来保存像 5 这样的值。但是如果您想存储age用户的属性,如果您不知道某人的年龄&#…

第8章:系统质量属性与架构评估

软件系统属性包括功能属性和质量属性,软件架构重点关注的是质量属性。架构的基本需求是在满足功能属性的前提下,关注软件系统质量属性。为了精确、定量地表达系统的质量属性,通常会采用质量属性场景的方式进行描述。   在确定软件系统架构&…

OpenGL3.3_C++_Windows(15)

理解glad: OpenGL只是一个标准/规范,具体的实现是由驱动开发商针对特定显卡实现的,由于OpenGL驱动版本众多,它大多数函数的位置都无法在编译时确定下来,需要在运行时查询,因此开发者需要在运行时获取函数…

Flutter GetX 状态管理 响应式编程(三)

在2021年4月初,我们在应用开发中大量使用了 GetX,目前看来效果还不错,于是我最近也出了一套GetX的从入门到源码原理的分析教程,欢迎大家关注更新。 【1 GetX 基本使用路由管理】【2 GetX 使用入门 程序计数器】 第一步 使用 GetM…

可灵王炸更新,图生视频、视频续写,最长可达3分钟!Runway 不香了 ...

现在视频大模型有多卷? Runway 刚在6月17号 发布Gen3 ,坐上王座没几天; 可灵就在6月21日中午,重新夺回了王座!发布了图生视频功能,视频续写功能! 一张图概括: 二师兄和团队老师第一…

实施高效冷却技术:确保滚珠丝杆稳定运行!

滚珠丝杆在运行过程中,由于摩擦、惯性力等因素,会产生一定的热量,当热量无法及时散发时,滚珠丝杆的温度就会升高,会直接影响滚珠丝杆的精度和稳定性,从而影响最终的产品质量。为了让滚珠丝杆保持应有的精度…

Redis源码学习:ziplist的数据结构和连锁更新问题

ziplist ziplist 是 Redis 中一种紧凑型的列表结构&#xff0c;专门用来存储元素数量少且每个元素较小的数据。它是一个双端链表&#xff0c; 可以在任意一端进行压入/弹出操作&#xff0c;并且该操作的时间复杂度为O(1)。 ziplist数据结构 <zlbytes><zltail>&l…

Linux基础指令(三)

目录 shell 权限指令&#xff1a; 文件的操作权限&#xff1a; 对文件进行操作的用户分类&#xff1a; 用户对文件进行的操作分类&#xff1a; 所有者、所属组、其他的访问权限&#xff1a; 创建用户 沾滞位 匹配查找指令&#xff1a; grep find shell shell&#x…

Ubuntu22.04开机后发现IP地址变成127.0.0.1

开机就是这个样子 解决办法 ip地址可能被释放&#xff0c;需要重新设置成自动分配 sudo dhclient -v可能网卡未加托管 查看方式: nmcli n若是enable就是已被托管,若是disabled&#xff0c;说明网卡未被托管 解决办法: nmcli n on搞定

DataWhale - 吃瓜教程学习笔记(二)

学习视频&#xff1a;第3章-一元线性回归_哔哩哔哩_bilibili 西瓜书对应章节&#xff1a; 3.1 - 3.2 一元线性回归 - 最小二乘法 - 极大似然估计 - 梯度 多元函数的一阶导数 - 海塞矩阵 多元函数的二阶导数 - 机器学习三要素

软件介绍—Fluent Reader (RSS阅读器)

软件介绍—Fluent Reader &#xff08;RSS阅读器&#xff09; 01 RSS介绍 RSS可翻译为简易信息聚合&#xff08;也叫聚合内容&#xff09;是一种基于XML的标准&#xff0c;在互联网上被广泛采用的内容包装和投递协议。简单来讲&#xff0c;就是可以“订阅”一些网站新发布的内…

【Android面试八股文】Kotlin内置标准函数also的原理是什么?

文章目录 原理解析应用场景为什么使用 `also`?also 是 Kotlin 标准库中的一个内置函数,其原理和应用场景可以通过源码和示例来解释。 原理解析 also 的定义如下: /*** Calls the specified function [block] with `this` value as its argument and returns `this` value.…

Android 开发Android Studio创建第一个Android应用

本文讲解如何Android Studio创建第一个Android应用。 启动Android Studio 或打开的项目的界面 点击File-New-New Project 选择“ Empty Views Activity”&#xff0c;点击Next 点击Next&#xff0c;项目创建完成如下&#xff1a; 创建项目完成&#xff0c;自带一个Activity。 …

FreeRTOS消息队列

队列简介 更详细的操作入下图所示&#xff1a; 传输数据的方法 FreeRTOS中的队列传输使用的是拷贝&#xff1a;把数据、把变量的值复制进队列里 FreeRTOS 使用拷贝值的方法&#xff0c;这更简单&#xff1a; &#xff08;1&#xff09; 局部变量的值可以发送到队列中&#…