Kotlin下的5种单例模式:从“饿汉”到“高阶玩家”的进化史

在Kotlin的世界里,单例模式就像游戏里的“隐藏关卡”,看似简单,实则暗藏玄机。今天,我们就用“吃货”的视角,带大家解锁Kotlin中5种单例模式的正确姿势——从“饿汉”的急性子,到“懒汉”的拖延症,再到“双重校验锁”的强迫症,最后甚至能召唤出“枚举大神”和“静态内部类”这种隐藏BOSS![1][3][4][6][7][10][11]


1. 饿汉式:急性子的“吃货”

特点:类加载时就吃光所有资源,线程安全但可能浪费。
代码

object SingletonHunger {  
    init { println("饿汉式:我出生就吃饱了!") }  
    fun eat() { println("啃着鸡腿看世界~") }  
}

场景:适合全局配置、轻量级工具类(比如日志工具)。
幽默解读:饿汉式就像你刚进火锅店就点满一桌菜,不管吃不吃得下,先占着再说![11]


2. 懒汉式:拖延症晚期患者

特点:第一次被调用时才“起床干活”,但需要同步锁防多线程抢饭吃。
代码

class SingletonLazy private constructor() {  
    companion object {  
        @Volatile private var instance: SingletonLazy? = null  
        fun getInstance(): SingletonLazy {  
            return instance ?: synchronized(this) {  
                instance ?: SingletonLazy().also { instance = it }  
            }  
        }  
    }  
    fun eat() { println("懒汉式:等我刷完手机再吃饭!") }  
}

场景:资源密集型对象(如数据库连接池)。
幽默解读:懒汉式就像你躺在床上喊外卖,结果5个骑手同时敲门,最后还得自己爬起来开门。[11]


3. 双重校验锁(DCL):强迫症的“完美主义”

特点:结合懒加载和线程安全,用@Volatile防止指令重排序,性能最优。
代码

class SingletonDCL private constructor() {  
    companion object {  
        @Volatile private var instance: SingletonDCL? = null  
        fun getInstance(): SingletonDCL {  
            return instance ?: synchronized(this) {  
                instance ?: SingletonDCL().also { instance = it }  
            }  
        }  
    }  
    fun eat() { println("DCL:先检查碗干不干净,再动筷子!") }  
}

场景:高频访问的缓存服务、性能敏感型模块。
幽默解读:DCL就像你吃饭前非要先擦桌子、摆碗筷、拍照发朋友圈,确认一切完美才动筷。[11]


4. 静态内部类:JVM的“黑科技”

特点:利用类加载机制实现延迟加载和线程安全,无显式同步锁。
代码

class SingletonHolder private constructor() {  
    companion object {  
        val instance = Holder.INSTANCE  
    }  
    private object Holder {  
        val INSTANCE = SingletonHolder()  
    }  
    fun eat() { println("静态内部类:我的饭在另一个锅里热着~") }  
}

场景:IO密集型服务(如文件解析器)。
幽默解读:静态内部类就像你妈把饭藏在厨房,你喊一声“妈我饿了”,她才从锅里端出热乎的。[11]


5. 枚举单例:JVM的“终极保镖”

特点:绝对线程安全,防止反射攻击和序列化破坏,代码最简洁。
代码

enum class SingletonEnum {  
    INSTANCE;  
    fun eat() { println("枚举:我是JVM亲生的,谁也别想动我饭碗!") }  
}

场景:安全性要求高的模块(如权限控制器)。
幽默解读:枚举单例就像你带着保镖吃饭,谁敢抢你的鸡腿,保镖直接把他扔出去![11]


终极对比表:选对模式,少走弯路

模式线程安全延迟加载代码复杂度适用场景
饿汉式全局配置、轻量级工具类
懒汉式⭐⭐⭐数据库连接池、网络服务
DCL⭐⭐⭐⭐高频缓存、性能敏感模块
静态内部类⭐⭐文件解析、IO密集型服务
枚举单例权限控制、高安全需求模块

总结:单例模式的“吃货哲学”

  • 饿汉式:急性子,先占资源再说。
  • 懒汉式:拖延症,但会锁门防抢。
  • DCL:强迫症,追求完美流程。
  • 静态内部类:藏饭高手,随叫随到。
  • 枚举单例:VIP待遇,JVM保驾护航。

下次写代码时,记得根据场景选对“吃饭方式”,否则可能饿肚子(性能问题)或撑死(资源浪费)哦![11]

互动话题:你项目中用过哪种单例模式?踩过哪些坑?评论区见!👇

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐