当前位置: 首页 > 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 }}}}}

相关文章:

Java 和 Kotlin 单例模式写法对比

目录 1、饿汉模式 Java 写法: Kotlin 写法: Kotlin 这段代码反编译&简化后如下: 2、懒汉模式,静态同步方法 Java 写法: Kotlin 写法: Kotlin 这段代码反编译&简化后如下: 3、懒…...

解析connectionReset异常的原因与解决方案

解析connectionReset异常的原因与解决方案 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们将深入探讨Java中connectionReset异常的原因及其解决方案。这…...

mindspore打卡第9天 transformer的encoder和decoder部分

mindspore打卡第9天 transformer的encoder和decoder部分 import mindspore from mindspore import nn from mindspore import ops from mindspore import Tensor from mindspore import dtype as mstypeclass ScaledDotProductAttention(nn.Cell):def __init__(self, dropout_…...

Python实现IPv4地址和16进制互相转换

Python实现IPv4地址和16进制互相转换 import socketdef ip_to_hex16(ipaddr):# 使用 socket 库中的方法将IP地址转换为网络字节序的二进制表示hex_bytes socket.inet_aton(ipaddr)# 将二进制数据转换为整数, 其中byteorderbig 表示使用大端字节序(从高位到低位&…...

计算机视觉 | 基于图像处理和边缘检测算法的黄豆计数实验

目录 一、实验原理二、实验步骤1. 图像读取与预处理2. 边缘检测3. 轮廓检测4. 标记轮廓序号 三、实验结果四、完整代码 Hi,大家好,我是半亩花海。 本实验旨在利用 Python 和 OpenCV 库,通过图像处理和边缘检测算法实现黄豆图像的自动识别和计…...

深入分析 Android BroadcastReceiver (七)

文章目录 深入分析 Android BroadcastReceiver (七)1. 高级应用场景1.1 示例:动态权限请求1.2 示例:应用内通知更新 2. 安全性与性能优化2.1 示例:设置权限防止广播攻击2.2 示例:使用 LocalBroadcastManager2.3 示例:在…...

C++中的数据结构

一.STL标准库 结构:STL中有六大组件,分别是:容器,算法,迭代器,仿函数,配接器,配置器;以下分别介绍这六大组件中的最主要的三个。 1.容器 容器来配置存储空间,算法通过…...

武汉星起航:一站式服务,助力亚马逊卖家高效运营,实现收益飞跃

在跨境电商的浪潮中,武汉星起航电子商务有限公司以其独特的一站式跨境电商服务,为众多亚马逊卖家提供了强有力的支持,助力他们在不断发展的市场中脱颖而出,实现收益的大幅提升。 武汉星起航的一站式跨境电商服务,以其…...

从灵感到实践:Kimi辅助完成学术论文选题的文艺之旅

学境思源,一键生成论文初稿: AcademicIdeas - 学境思源AI论文写作 昨天我们为大家介绍了ChatGPT辅助完成实现设计(AI与学术的交响:ChatGPT辅助下的实验设计新篇章)。今天我们再来看看Kimi对于论文选题都能提供哪些帮助…...

华为od-C卷200分题目4 -电脑病毒感染

华为od-C卷200分题目4 -电脑病毒感染 一个局域网内有很多台电脑,分别标注为0 - N-1的数字。相连接的电脑距离不一样,所以感染时间不一样,感染时间用t表示。其中网络内一个电脑被病毒感染,其感染网络内所有的电脑需要最少需要多长…...

show-overflow-tooltip 解决elementui el-table标签自动换行的问题

elementui中 el-table中某一行的高度不想因为宽度不够而撑开换行展示的解决方法。可通过show-overflow-tooltip属性解决&#xff0c;如下 代码是这样的 <el-table-column width"80" prop"id" label"ID"></el-table-column> <el…...

数字社交的领航者:解析Facebook的引领作用

在当今数字化社会中&#xff0c;社交网络已经成为了人们日常生活不可或缺的一部分。而在众多社交平台中&#xff0c;Facebook凭借其巨大的用户基础和创新的技术应用&#xff0c;被公认为数字社交领域的领航者之一。本文将深入解析Facebook在数字社交中的引领作用&#xff0c;探…...

深度分析 Apache Flink 窗口机制

什么是 Flink 窗口&#xff1f; Apache Flink 是一个用于处理实时流数据的开源框架&#xff0c;其核心功能之一是窗口&#xff08;Window&#xff09;机制。窗口是 Flink 在处理流数据时用于划分数据流的逻辑概念&#xff0c;它将无限的流数据切割成有限的、可管理的部分&…...

ubuntu 软链接(ubuntu20.04)

ubuntu 软链接&#xff08;ubuntu20.04&#xff09; 在Ubuntu和其他Linux系统中&#xff0c;软链接&#xff08;也称为符号链接&#xff09;是文件系统中的一个特殊类型的文件&#xff0c;它作为一个引用或指针&#xff0c;指向另一个文件或目录。软链接类似于Windows中的快捷…...

如何在LabVIEW中使用FPGA模块

LabVIEW FPGA模块是NI公司推出的一款强大工具&#xff0c;它允许用户使用LabVIEW图形化编程环境来开发FPGA&#xff08;现场可编程门阵列&#xff09;应用程序。与传统的HDL&#xff08;硬件描述语言&#xff09;编程相比&#xff0c;LabVIEW FPGA模块大大简化了FPGA开发的过程…...

FPGA开发技能(7)Vivado设置bit文件加密

文章目录 前言1. AES加密原理2.xilinx的AES方案3.加密流程3.1生成加密的bit流3.2将密钥写入eFUSE寄存器 4.验证结论5.传送门 前言 在FPGA的项目发布的时候需要考虑项目工程加密的问题&#xff0c;一方面防止自己的心血被盗&#xff0c;另一方面也保护公司资产&#xff0c;保护知…...

【算法专题--链表】旋转链表 -- 高频面试题(图文详解,小白一看就懂!!)

目录 一、前言 二、题目描述 三、解题方法 ⭐解题思路---闭合为环 &#x1f34d; 案例图解 四、总结与提炼 五、共勉 一、前言 旋转链表 这道题&#xff0c;可以说是--链表专题--&#xff0c;最经典的一道题&#xff0c;也是在面试中频率最高的一道题目&#x…...

ElasticSearch 和 MySQL的区别

MySQLElasticSearch 数据库&#xff08;database&#xff09;索引&#xff08;index&#xff09;数据表&#xff08;table&#xff09; 类型&#xff08;type&#xff09; 记录文档&#xff08;document&#xff0c;json格式&#xff09; 一、ES基础命令 1. ES cat查询命令 2.…...

Linux部署wordpress站点

先安装宝塔面板 yum install -y wget && wget -O install.sh https://download.bt.cn/install/install_6.0.sh && sh install.sh ed8484bec 因为wordpress需要php&#xff0c;mysql&#xff0c;apache &#xff0c;httpd环境 参考&#xff1a;Linux 安装宝塔…...

实体零售连锁企业如何通过物流接口实现数智化转型升级?

在电子商务浪潮的持续冲击下&#xff0c;传统的实体零售行业面临着巨大的挑战。为了在线上线下融合的新零售时代保持竞争力&#xff0c;众多实体零售企业积极寻求数字化转型的突破。 某中国零售连锁百强企业近年来致力于打造自有品牌的线上销售体系&#xff0c;自2021年8月起接…...

国防科技大学计算机基础课程笔记02信息编码

1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制&#xff0c;因此这个了16进制的数据既可以翻译成为这个机器码&#xff0c;也可以翻译成为这个国标码&#xff0c;所以这个时候很容易会出现这个歧义的情况&#xff1b; 因此&#xff0c;我们的这个国…...

逻辑回归:给不确定性划界的分类大师

想象你是一名医生。面对患者的检查报告&#xff08;肿瘤大小、血液指标&#xff09;&#xff0c;你需要做出一个**决定性判断**&#xff1a;恶性还是良性&#xff1f;这种“非黑即白”的抉择&#xff0c;正是**逻辑回归&#xff08;Logistic Regression&#xff09;** 的战场&a…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统

医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上&#xff0c;开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识&#xff0c;在 vs 2017 平台上&#xff0c;进行 ASP.NET 应用程序和简易网站的开发&#xff1b;初步熟悉开发一…...

【论文笔记】若干矿井粉尘检测算法概述

总的来说&#xff0c;传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度&#xff0c;通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

华为OD机试-食堂供餐-二分法

import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

今日科技热点速览

&#x1f525; 今日科技热点速览 &#x1f3ae; 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售&#xff0c;主打更强图形性能与沉浸式体验&#xff0c;支持多模态交互&#xff0c;受到全球玩家热捧 。 &#x1f916; 人工智能持续突破 DeepSeek-R1&…...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...

自然语言处理——Transformer

自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效&#xff0c;它能挖掘数据中的时序信息以及语义信息&#xff0c;但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN&#xff0c;但是…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA

浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求&#xff0c;本次涉及的主要是收费汇聚交换机的配置&#xff0c;浪潮网络设备在高速项目很少&#xff0c;通…...

jmeter聚合报告中参数详解

sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample&#xff08;样本数&#xff09; 表示测试中发送的请求数量&#xff0c;即测试执行了多少次请求。 单位&#xff0c;以个或者次数表示。 示例&#xff1a;…...