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 {
   @NotNull
   public 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? = null
            get() {
                if (field == null) {
                    field = SingletonDemo2()
                }
                return field
            }

        @Synchronized
        fun get(): SingletonDemo2 {
            return INSTANCE!!
        }
    }

}

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

public final class SingletonDemo2 {
    @NotNull
    public static final Companion Companion = new Companion();
    private static SingletonDemo2 INSTANCE;

    private SingletonDemo2() {
    }

    public static final class Companion {
        private Companion() {
        }

        @NotNull
        public 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 {
    @NotNull
    public static final SingletonDemo2.Companion Companion = new SingletonDemo2.Companion();
    @NotNull
    private static final Lazy INSTANCE$delegate;

    private SingletonDemo2() {
    }

    static {
        INSTANCE$delegate = LazyKt.lazy(LazyThreadSafetyMode.SYNCHRONIZED, (Function0)null.INSTANCE);
    }

    public static final class Companion {
        private Companion() {
        }

        @NotNull
        public 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 {
    @NotNull
    public static final SingletonDemo100.Companion Companion = new SingletonDemo100.Companion();
    @NotNull
    private static final SingletonDemo100 INSTANCE;

    private SingletonDemo100() {
    }

    static {
        INSTANCE = SingletonDemo100.SingletonHolder.INSTANCE.getHolder();
    }

    public static final class Companion {
        private Companion() {
        }

        @NotNull
        public final SingletonDemo100 getINSTANCE() {
            return SingletonDemo100.INSTANCE;
        }
    }

    private static final class SingletonHolder {
        @NotNull
        public static final SingletonDemo100.SingletonHolder INSTANCE = new SingletonDemo100.SingletonHolder();
        @NotNull
        private static final SingletonDemo100 holder = new SingletonDemo100();

        @NotNull
        public 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 {

        @Volatile
        private var INSTANCE: SingletonDemo10? = null

        fun getInstance(property: Int): SingletonDemo10 {
            return INSTANCE ?: synchronized(this) {
                INSTANCE ?: SingletonDemo10(property).also { INSTANCE = it }
            }
        }

    }

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/734896.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

YOLOv10目标检测算法的使用

目录 一、环境安装 1、创建虚拟环境 2、安装依赖 二、数据集准备 1、预训练权重 2、数据划分 3、建立数据集的yaml文件 三、训练 1、终端运行指令 2、建立一个 python 文件运行 四、验证 1、终端运行指令 2、建立一个 python 文件运行 五、模型推理 1、单张图片推…

AtCoder Beginner Contest 359(ABCDEFG题)视频讲解

A - Count Takahashi Problem Statement You are given N N N strings. The i i i-th string S i S_i Si​ ( 1 ≤ i ≤ N ) (1 \leq i \leq N) (1≤i≤N) is either Takahashi or Aoki. How many i i i are there such that S i S_i Si​ is equal to Takahashi? C…

基于IDEA的Maven(坐标信息介绍和编写)

这篇博客来学习和分析一下: " pom.xml " 所生成的最基本的信息。 之前的博客中讲到,学 Maven 就是学 " pom.xml " 的配置。后面也会围绕这个文件进行学习。 目录 一、分析 pom.xml 文件 (1)分析的 "p…

YOLOv9基础 | 实时目标检测新SOTA,手把手带你深度解析yolov9论文!

前言:Hello大家好,我是小哥谈。YOLOv9是Chien-Yao Wang等人提出的YOLO系列的最新版本之一(截止到目前,YOLOv10已发布),于2024年2月21日发布。它是 YOLOv7的改进版本,两者均由Chien-Yao Wang及其同事开发。本节课就以YOLOv9论文为基础带大家深入解析YOLOv9算法。🌈 …

React+TS前台项目实战(十五)-- 全局常用组件Table封装

文章目录 前言Table组件1. 功能分析2. 代码详细注释3. 使用方式4. 效果展示 总结 前言 在这篇文章中,我们将对本系列项目中常用的表格组件Table进行自定义封装,以提高性能并适应项目需求。后期也可进行修改和扩展,以满足项目的需求。 Table组…

html--404页面

<!DOCTYPE html> <html> <head> <meta http-equiv"Content-Type" content"text/html; charsetUTF-8"> <meta http-equiv"X-UA-Compatible" content"IEedge,chrome1"> <title>404 错误页面不存在&…

【Linux】进程间通信3——线程安全

1.Linux线程互斥 1.1.进程线程间的互斥相关背景概念 临界资源&#xff1a; 多线程执行流共享的资源叫做临界资源。临界区&#xff1a; 每个线程内部&#xff0c;访问临界资源的代码&#xff0c;就叫做临界区。互斥&#xff1a; 任何时刻&#xff0c;互斥保证有且只有一个执行…

一年前 LLM AGI 碎片化思考与回顾系列⑦ · 在SystemⅡ未知之境之中徘徊

阅读提示&#xff1a; 本篇系列内容的是建立于自己过去一年在以LLM为代表的AIGC快速发展浪潮中结合学术界与产业界创新与进展的一些碎片化思考并记录最终沉淀完成&#xff0c;在内容上&#xff0c;与不久前刚刚完稿的那篇10万字文章「融合RL与LLM思想&#xff0c;探寻世界模型以…

乾坤微服务的使用

前言&#xff1a; 在这里整理下用乾坤来开发微服务的一些资料。 使用好处&#xff1a; 使用乾坤可以实现什么效果呢&#xff1f;众所周知&#xff0c;前端的框架五花八门&#xff0c;react/vue/angular等各领风骚&#xff0c;那么如果我们有需要把不同技术栈的项目整合起来&…

UFS Power Mode Change 介绍

一. UFS Power Mode Change简介 1.UFS Power Mode指的是Unipro层的Power State, 也可以称为链路(Link)上的Power Mode, 可以通过配置Unipro Attribute, 然后控制切换Unipro Power State, 当前Power Mode Change有两种触发方式&#xff1a; (1) 通过DME Power Mode Change触发…

Tortoise 删除文件

1、右击需要删除的文件&#xff0c;选择Delete 2、提交

遗传算法求解时间窗车辆路径规划问题(附python代码)

摘要 本研究提出了一种基于遗传算法的车辆路径规划&#xff08;VRP&#xff09;问题求解框架&#xff0c;它能够有效地处理一系列复杂约束&#xff0c;包括软时间窗、硬时间窗、行驶距离限制、车辆最大载重量、多个配送中心的协调、特定的配送顺序&#xff0c;以及多种车型的选…

【Python系列】探索 NumPy 中的 mean 函数:计算平均值的利器

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

【AI技术】GPT-4o背后的语音技术猜想

前言&#xff1a; 本篇文章全文credit 给到 台大的李宏毅老师&#xff0c;李宏毅老师在机器学习上风趣幽默、深入浅出的讲解&#xff0c;是全宇宙学AI、讲中文学生的福音&#xff0c;强力推荐李宏毅老师的机器学习课程和深度学习 人工智能导论&#xff1b; 李宏毅老师的个人长…

LabVIEW机器视觉在质量控制中的应用

基于LabVIEW的机器视觉系统在质量控制中应用广泛&#xff0c;通过图像采集、处理和分析&#xff0c;自动检测产品缺陷、测量尺寸和识别标记&#xff0c;提高生产效率和产品质量。下面介绍LabVIEW机器视觉系统在质量控制中的实现方法、应用场景及其优势。 项目背景 在现代制造业…

Redis 入门篇

文章目录 Redis简介关系型数据库:非关系型数据库 Redis应用场景Redis下载和安装Redis 数据类型Redis 常用命令字符串 string 操作命令哈希 hash 操作命令列表 list 操作命令集合 set 操作命令有序集合 sorted set 操作命令通用命令 Jedis 快速入门配置依赖建立连接 / 操作 Jedi…

ShareX,屏幕截图、屏幕录制和文件共享,还提供了丰富的高级功能和自定义选项

ShareX是一个免费开源的Windows应用程序&#xff0c;用于屏幕截图、屏幕录制和文件共享。它不仅支持基本的屏幕截图功能&#xff0c;还提供了丰富的高级功能和自定义选项&#xff0c;使其成为提高工作效率和截图体验的利器。以下是ShareX v16.1.0便携版的主要功能和特色&#x…

NeRF从入门到放弃4: NeuRAD-针对自动驾驶场景的优化

NeuRAD: Neural Rendering for Autonomous Driving 非常值得学习的一篇文章&#xff0c;几乎把自动驾驶场景下所有的优化都加上了&#xff0c;并且也开源了。 和Unisim做了对比&#xff0c;指出Unisim使用lidar指导采样的问题是lidar的垂直FOV有限&#xff0c;高处的东西打不…

Vue: Module “vue“ has no exported member xxx

这个问题让我困扰了好一会儿&#xff0c;我询问了 chatgpt 和各种网站社区&#xff0c;尝试了切换依赖的版本&#xff0c;清除缓存等等&#xff0c;依然没有解决 不过算是有心栽花花不开&#xff0c;无心插柳柳成荫&#xff0c;碰巧解决了&#xff0c;也不知道是不是这个原因&a…

java收徒 java辅导 java试用期辅导 java零基础学习

&#x1f497;博主介绍&#xff1a;✌全网粉丝1W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f31f;文末报名辅导&#x1f31f; 感兴趣的可以先收藏起来&#xff0c;还有大家…