Kotlin 5種單例模式

在Kotlin中實現單例模式有多種方法,以下是幾種常見的方法:

  1. 餓漢式
    餓漢式是最簡單的一種實現方式,在類加載時就完成了實例的初始化。
//餓漢式
object Singleton1 {fun printMessage() {println("===餓漢式")}
}
  1. 懶漢式
    懶漢式是延遲加載的方式,只有在第一次使用時才創建實例。
class Singleton2 private constructor() {companion object {private var instance: Singleton2? = null@Synchronizedfun getInstance(): Singleton2 {if (instance == null) {instance = Singleton2()}return instance!!}}fun printMessage() {println("===懶漢式")}
}
  1. 雙重檢查鎖定
    雙重檢查鎖定是一種更高效的懶漢式實現,通過雙重檢查鎖定來確保線程安全。
class Singleton3 private constructor() {companion object {private var instance: Singleton3? = null;fun getInstance(): Singleton3 {if (instance == null) {synchronized(Singleton3::class.java) {if (instance == null) {instance = Singleton3()}}}return instance!!}}fun printMessage() {println("===雙重檢查鎖定")}
}
  1. 靜態內部類
    靜態內部類是實現單例模式的另一種方式,利用了Java的類加載機制來保證線程安全。
//靜態內部類
class Singleton4 private constructor() {companion object {private var instance: Singleton4? = nullfun getInstance(): Singleton4 {return Holder.instance}private object Holder {val instance = Singleton4()}}fun printMessage() {println("===靜態內部類")}
}
  1. 枚舉
    枚舉是實現單例模式的最佳方法,它天生就是線程安全的,并且能夠防止反序列化創建新的對象。
//枚舉
enum class Singleton5 {INSTANCE;fun printMessage() {println("===枚舉")}}
fun main() {Singleton1.printMessage()Singleton2.getInstance().printMessage()Singleton3.getInstance().printMessage()Singleton4.getInstance().printMessage()Singleton5.INSTANCE.printMessage()
}
打印結果:
===餓漢式
===懶漢式
===雙重檢查鎖定
===靜態內部類
===枚舉

以上就是在Kotlin中實現單例模式的幾種常見方法。每種方法都有其優缺點,可以根據具體的需求選擇合適的方法。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/71427.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/71427.shtml
英文地址,請注明出處:http://en.pswp.cn/web/71427.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

探秘基帶算法:從原理到5G時代的通信變革【一】引言

文章目錄 一、引言1.1 研究背景與意義1.2 研究目的與方法1.3 研究內容與創新點 本博客為系列博客,主要講解各基帶算法的原理與應用,包括:viterbi解碼、Turbo編解碼、Polar編解碼、CORDIC算法、CRC校驗、FFT/DFT、QAMtiaozhi/解調、QPSK調制/解…

C/C++輸入輸出(1)

1.getchar和putchar 1.1getchar() 函數原型: 1 int getchar(void); getchar()函數返回用戶從鍵盤輸入的字符,使用時不帶有任何參數。 程序運行到這個命令就會暫停,等待用戶從鍵盤輸入,等同于使用cin或scanf()方法讀取一個字符…

【消息隊列】數據庫的數據管理

1. 數據庫的選擇 對于當前實現消息隊列這樣的一個中間件來說,具體要使用哪個數據庫,是需要稍作考慮的,如果直接使用 MySQL 數據庫也是能實現正常的功能,但是 MySQL 也是一個客戶端服務器程序,也就意味著如果想在其他服…

飛機大戰lua迷你世界腳本

-- 迷你世界飛機大戰 v1.2 -- 星空露珠工作室制作 -- 最后更新:2024年1月 ----------------------------- -- 迷你世界API適配配置 ----------------------------- local UI { BASE_ID 7477478487091949474-22856, -- UI界面ID ELEMENTS { BG 1, -- 背景 BTN_LE…

圖解MOE大模型的7個核心問題并探討DeepSeekMoE的專家機制創新

原文地址:https://newsletter.maartengrootendorst.com/p/a-visual-guide-to-mixture-of-experts #mermaid-svg-FU7YUSIfuXO6EVHa {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-FU7YUSIfuXO6EVHa .error-icon{fill…

【智能機器人開發全流程:硬件選型、軟件架構與ROS實戰,打造高效機器人系統】

文章目錄 1. 硬件層設計(1) 傳感器選型(2) 計算平臺 2. 軟件架構設計(1) 核心模塊劃分(2) 通信框架 3. 關鍵實現步驟(1) 硬件-軟件接口開發(2) SLAM與導航實現(3) 仿真與測試 4. 典型框架示例基于ROS的移動機器人分層架構 5. 優化與擴展6. 開源項目參考 1. 硬件層設計 (1) 傳感…

React Native v0.78 更新

這個版本在 React Native 中引入了 React 19,并帶來了一些重要的新功能,例如 Android 矢量圖(Vector Drawables)的原生支持 以及 iOS 更好的 Brownfield 集成。 亮點 React 19 集成更小更快的發布節奏可選擇在 Metro 中啟用 Jav…

機器學習數學通關指南

? 寫在前面 💡 在代碼的世界里沉浸了十余載,我一直自詡邏輯思維敏捷,編程能力不俗。然而,當我初次接觸 DeepSeek-R1 并領略其清晰、系統的思考過程時,我不禁為之震撼。那一刻,我深刻意識到:在A…

MySQL 實驗1:Windows 環境下 MySQL5.5 安裝與配置

MySQL 實驗1:Windows 環境下 MySQL5.5 安裝與配置 目錄 MySQL 實驗1:Windows 環境下 MySQL5.5 安裝與配置 一、MySQL 軟件的下載二、安裝 MySQL三、配置 MySQL 1、配置環境變量2、安裝并啟動 MySQL 服務3、設置 MySQL 字符集4、為 root 用戶設置登錄密…

煙花燃放安全管控:智能分析網關V4煙火檢測技術保障安全

一、方案背景 在中國諸多傳統節日的繽紛畫卷中,煙花盛放、燒紙祭祀承載著人們的深厚情感。一方面,煙花璀璨,是對節日歡慶氛圍的熱烈烘托,寄托著大家對美好生活的向往與期許;另一方面,裊裊青煙、點點燭光&a…

Elasticsearch:解鎖深度匹配,運用Elasticsearch DSL構建閃電般的高效模糊搜索體驗

目錄 Elasticsearch查詢分類 葉子查詢 全文檢索查詢 match查詢 multi_match查詢 精確查詢 term查詢 range查詢 復雜查詢 bool查詢簡單應用 bool查詢實現排序和分頁 bool查詢實現高亮 場景分析 問題思考 解決方案 search_after方案(推薦) point in time方案 方案…

數據安全VS創作自由:ChatGPT與國產AI工具隱私管理對比——論文黨程序員必看的避坑指南

文章目錄 數據安全VS創作自由:ChatGPT與國產AI工具隱私管理對比——論文黨程序員必看的避坑指南ChatGPTKimi騰訊元寶DeepSeek 數據安全VS創作自由:ChatGPT與國產AI工具隱私管理對比——論文黨程序員必看的避坑指南 產品隱私設置操作路徑隱私協議ChatGPT…

FFmpeg入門:最簡單的音視頻播放器

FFmpeg入門:最簡單的音視頻播放器 前兩章,我們已經了解了分別如何構建一個簡單和音頻播放器和視頻播放器。 FFmpeg入門:最簡單的音頻播放器 FFmpeg入門:最簡單的視頻播放器 本章我們將結合上述兩章的知識,看看如何融…

windows 上刪除 node_modules

在 Windows 11 上,你可以通過命令行來刪除 node_modules 文件夾并清除 npm 緩存。以下是具體步驟: 刪除 node_modules 打開命令提示符(Command Prompt)或終端(PowerShell)。 導航到項目目錄。你可以使用 …

kotlin的val聲明的變量是常量嗎

kotlin的val聲明的變量是常量嗎 DeepSeek R1 思考 65 秒 思考過程 嗯,用戶問的是Kotlin中的val聲明的變量是不是常量。首先我需要回憶一下Kotlin的基礎知識。記得在Kotlin里,val用來聲明只讀變量,也就是說一旦賦值之后就不能再重新賦值了。…

Linux下學【MySQL】中如何實現:多表查詢(配sql+實操圖+案例鞏固 通俗易懂版~)

每日激勵:“不設限和自我肯定的心態:I can do all things。 — Stephen Curry” 緒論?: 本章是MySQL篇中,非常實用性的篇章,相信在實際工作中對于表的查詢,很多時候會涉及多表的查詢,在多表查詢…

【基礎4】插入排序

核心思想 插入排序是一種基于元素比較的原地排序算法,其核心思想是將數組分為“已排序”和“未排序”兩部分,逐個將未排序元素插入到已排序部分的正確位置。 例如撲克牌在理牌的時候,一般會將大小王、2、A、花牌等按大小順序插入到左邊&…

【Flink銀行反欺詐系統設計方案】3.欺詐的7種場景和架構方案、核心表設計

【Flink銀行反欺詐系統設計方案】3.欺詐的7種場景和架構方案、核心表設計 1. **欺詐場景分類與案例說明**1.1 **大額交易欺詐**1.2 **異地交易欺詐**1.3 **高頻交易欺詐**1.4 **異常時間交易欺詐**1.5 **賬戶行為異常**1.6 **設備指紋異常**1.7 **交易金額突變** 2. **普適性軟…

迷你世界腳本生物接口:Creature

生物接口:Creature 彼得兔 更新時間: 2024-05-22 17:51:22 繼承自 Actor 具體函數名及描述如下: 序號 函數名 函數描述 1 getAttr(...) 生物屬性獲取 2 setAttr(...) 生物屬性設置 3 isAdult(...) 判斷該生物是否成年 4 setOxygenNeed(…

深入理解三色標記、CMS、G1垃圾回收器

三色標記算法 簡介 三色標記算法是一種常見的垃圾收集的標記算法,屬于根可達算法的一個分支,垃圾收集器CMS,G1在標記垃圾過程中就使用該算法 三色標記法(Tri-color Marking)是垃圾回收中用于并發標記存活對象的核心算…