kotlin 单例

1.使用伴生对象(companion object):

class Singleton private constructor() {

    companion object {
        private val instance: Singleton by lazy { Singleton() }

        fun getInstance(): Singleton {
            return instance
        }
    }

    // 其他类成员
}

获取实例

val instance = Singleton.getInstance()

这种方式提供了更多的灵活性,可以在伴生对象中定义一些其他的属性和方法

2.使用 object 关键字:

object Singleton {
    // 单例的属性和方法
}
获取实例

val instance = Singleton

这种方式简单明了,object 关键字会自动创建单例。可以直接通过 Singleton 访问单例的属性和方法。

3.使用 lazy 委托:

class Singleton private constructor() {

    companion object {
        val instance: Singleton by lazy { Singleton() }
    }

    // 其他类成员
}

获取实例

val instance = Singleton.instance

这种方式利用 lazy 委托,确保只有在首次访问 instance 属性时才会初始化单例。

4.使用 enum枚举类

enum class Singleton {
    INSTANCE;

    // 单例的属性和方法
}
获取实例

val instance = Singleton.INSTANCE

枚举类在 Kotlin 中可以用来创建单例,INSTANCE 就是这个单例的实例。

5.双重检查锁定

class Singleton private constructor() {

    companion object {
        @Volatile
        private var instance: Singleton? = null

        fun getInstance(): Singleton {
            return instance ?: synchronized(this) {
                instance ?: Singleton().also { instance = it }
            }
        }
    }

    // 其他类成员
}
 

获取实例
val instance = Singleton.getInstance()

这种方式在多线程环境下保证了懒加载的线程安全性,避免了每次获取实例都进行同步。

6.使用 Holder 模式:

class Singleton private constructor() {

    private object Holder {
        val INSTANCE = Singleton()
    }

    companion object {
        fun getInstance(): Singleton {
            return Holder.INSTANCE
        }
    }

    // 其他类成员
}

获取实例

val instance = Singleton.getInstance()

这种方式通过 Kotlin 的对象声明在 Holder 类中创建单例,确保了懒加载和线程安全性。

 

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

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

相关文章

帮你看懂广告行业名词解释,通俗易懂!!

一、DSP(需求方平台) 广告主只要在DSP平台投放广告,由DSP平台帮助广告主在多个媒体投放广告。(即DSP帮助广告主对对接多个平台) 二、ADX(广告交易平台,Ad Exchange) 连接媒体与广…

ARM工控机Node-red使用教程

嵌入式ARM工控机Node-red安装教程 从前车马很慢书信很远,而现在人们不停探索“科技改变生活”。 智能终端的出现改变了我们的生活方式,钡铼技术嵌入式工控机协助您灵活布建能源管理、大楼自动化、工业自动化、电动车充电站等各种多元性IoT应用&#xff…

Linux 编译安装 Nginx

目录 一、前言二、四种安装方式介绍三、本文安装方式:源码安装3.1、安装依赖库3.2、开始安装 Nginx3.3、Nginx 相关操作3.4、把 Nginx 注册成系统服务 四、结尾 一、前言 Nginx 是一款轻量级的 Web 服务器、[反向代理]服务器,由于它的内存占用少&#xf…

Android设备sdcard/tf卡不识别在电脑上可以

安卓tf卡无法使用现象 系统:安卓4.4 硬件:arm设备 t卡: 64GB 10 A1 microSD 出货后有用户反馈一批sdcard/tf卡用不了. 分析过程 拆了7台问题机,除一张t卡坏了外,其余卡插到电脑上后再放到设备上恢复正常…

bulk-RNA seq测序数据分析流程

假如有bulk-RNA测序的数据:TH1,TH2,TH3三个重复(实验组),TW1,TW2,TW3三个重复(对照组) 准备工作 需要安装的软件(如FastQC、Trimmomatic、HISAT…

adb shell getevent/sendevent

#### adb shell getevent 获取点击事件 100135925:/ # getevent add device 1: /dev/input/event2name: "mtk-tpd" /dev/input/event2: 0001 014a 00000001 /dev/input/event2: 0003 0039 00000088 /dev/input/event2: 0003 0035 00000072 /dev/input/event2: 00…

【Pytorch】学习记录分享10——TextCNN用于文本分类处理

【Pytorch】学习记录分享10——PyTorchTextCNN用于文本分类处理 1. TextCNN用于文本分类2. 代码实现 1. TextCNN用于文本分类 具体流程: 2. 代码实现 # coding: UTF-8 import torch import torch.nn as nn import torch.nn.functional as F import numpy as np…

14、接口

接口 ​ 接口interface,是一组行为规范的集合,就是定义一组未实现的函数声明。谁使用接口就是参照接口的方法定义实现它们。 type 接口名 interface {方法1 (参数列表1) 返回值列表1方法2 (参数列表2) 返回值列表2... }接口命名习惯在接口名后面加上er…

【机器学习:欧氏距离 】机器学习中欧氏距离的理解和应用

【机器学习:欧氏距离 】机器学习中欧氏距离的理解和应用 距离公式二维更高的维度点以外的物体属性欧几里得距离的平方概括历史 在数学中,欧氏距离’是指欧氏空间中任意两点之间的直线距离。这种距离可以通过应用勾股定理来计算,利用两点的笛卡…

如何停止一个运行中的Docker容器

要停止一个运行中的Docker容器&#xff0c;你可以使用以下命令&#xff1a; docker stop <容器ID或容器名> 将 <容器ID或容器名> 替换为你要停止的具体容器的标识符或名称。你可以使用以下命令查看正在运行的容器&#xff1a;docker ps 这将列出所有正在运行的…

Linux内核(2)-Makefile详解,必须要掌握的编译参数

1.版本号 VERSION 4 PATCHLEVEL 1 SUBLEVEL 152.MAKEFLAGS变量 MAKEFLAGS -rR --include-dir$(CURDIR) 包含当前目录及所有递归子目录 3.make V1编译输出 make V1 输出编译完整命令 ifeq ("$(origin V)", "command line")KBUILD_VERBOSE $(V) en…

再检查下这些测试思维面试题你都会了么?

创建坐席组的功能模块&#xff0c;如何进行测试用例设计&#xff1f; 解答&#xff1a; 功能测试&#xff0c;使用等价类划分法去分析创建坐席的每个输入项的有效及无效类&#xff0c;同步考虑边界值去设计对应的测试用例&#xff1a; 先进行冒烟测试&#xff0c;正常创建坐席…

操作系统期末复习知识点

目录 一.概论 1.操作系统的介绍 2.特性 3.主要功能 4.作用 二.进程的描述与控制 1.进程的定义 2.特性 3.进程的创建步骤 4.基本状态转化 5.PCB的作用 6.进程与线程的比较 三.进程同步 1.同步的概念&#xff08;挺重要的&#xff09; 2.临界区 3.管程和进程的区…

62.网游逆向分析与插件开发-游戏增加自动化助手接口-游戏公告类的C++还原

内容来源于&#xff1a;易道云信息技术研究院VIP课 上一个内容&#xff1a;游戏红字公告功能的逆向分析-CSDN博客 码云地址&#xff08;master分支&#xff09;&#xff1a;https://gitee.com/dye_your_fingers/sro_-ex.git 码云版本号&#xff1a;0888e34878d9e7dd0acd08ef…

Redis第四讲——Redis的数据库结构、删除策略及淘汰策略

一、redis中的数据库 redis服务器将所有数据库都保存在服务器状态redis.h/redisServer结构的db数组中。db数组的每项都是一个redis.h/redisDb结构&#xff0c;而每个redisDb结构就代表一个数据库。在初始化服务器时&#xff0c;程序会根据服务器状态的dbnum属性来决定应该创建多…

C++ 操作重载与类型转换

文章目录 基本概念为什么使用操作重载&#xff1f;注意事项&#xff1a; 输入和输出运算符重载输出运算符 <<重载输入运算符 >> 算术和关系运算符算术运算符相等运算符关系运算符 赋值运算符基本原则&#xff1a;示例&#xff1a;注意事项&#xff1a; 下标运算符实…

outlook邮件群发单显技巧?群发怎么单显?

outlook邮件群发单显如何设置&#xff1f;QQ邮箱怎么群发单显&#xff1f; 在群发邮件时&#xff0c;如何让每个收件人只看到自己的名字&#xff0c;而不是其他人的名字&#xff0c;这就涉及到所谓的“单显”技巧。下面蜂邮EDM就为大家揭秘Outlook邮件群发单显的奥秘。 outlo…

实战干货:用 Python 批量下载百度图片!

为了做一个图像分类的小项目&#xff0c;需要制作自己的数据集。要想制作数据集&#xff0c;就得从网上下载大量的图片&#xff0c;再统一处理。 这时&#xff0c;一张张的保存下载&#xff0c;就显得很繁琐。那么&#xff0c;有没有一种方法可以把搜索到的图片直接下载到本地电…

Spark 运行架构

Spark 框架的核心是一个计算引擎&#xff0c;整体来说&#xff0c;它采用了标准 master-slave 的结构。 如下图所示&#xff0c;它展示了一个 Spark 执行时的基本结构。图形中的 Driver 表示 master&#xff0c; 负责管理整个集群中的作业任务调度。图形中的 Executor 则是 sla…

Swift爬虫使用代理IP采集唯品会商品详情

目录 一、准备工作 二、代理IP的选择与使用 三、使用Swift编写唯品会商品爬虫 四、数据解析与处理 五、注意事项与优化建议 六、总结 一、准备工作 在开始编写爬虫之前&#xff0c;需要准备一些工具和库&#xff0c;以确保数据抓取的顺利进行。以下是所需的工具和库&…