You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自制Kotlin单例实现是否正确?该实现较其他方案更简洁

关于你这个Kotlin单例实现的分析

嘿,你的这个单例写法确实挺简洁的,但咱们得拆解下它的潜在问题,同时对比下Kotlin里更优的方案:

你的实现本身的可用性

先看你给出的代码:

class SingletonTwo private constructor(){
    var myAge: Int = 16
    companion object {
        val ourInstance = SingletonTwo()
    }
}
// 调用方式
var abc: Int
abc = SingletonTwo.ourInstance.myAge

这个属于饿汉式单例,在JVM环境下,它的实例会在SingletonTwo类(或其伴生对象)被加载时就创建完成。由于JVM类加载过程本身是线程安全的,所以不会出现多线程下创建多个实例的问题——这一点是完全没问题的。

但它存在的几个可优化点

  • 缺少懒加载特性:不管你的代码有没有实际用到这个单例,它都会在类加载时就完成初始化。如果这个单例占用资源较多(比如持有大内存对象、初始化逻辑耗时久),会造成不必要的资源浪费。
  • 写法不够极致简洁:Kotlin其实提供了原生的单例语法,比你这个写法更省心易用。

Kotlin里更推荐的单例实现

直接使用object关键字就能实现线程安全的懒加载单例,写法比你的实现简洁太多:

object SingletonTwo {
    var myAge: Int = 16
}
// 调用时直接访问,不需要额外的instance属性
val abc = SingletonTwo.myAge

这个写法是Kotlin官方推荐的,它背后已经帮你处理了所有细节:

  • 线程安全的懒初始化(只有第一次访问时才创建实例)
  • 自动保证单例唯一性
  • 省去了手动编写私有构造和伴生对象的冗余代码

总结

你的实现本身是可以正常工作的,不会出现多线程下实例重复创建的问题,但从Kotlin语言特性的角度来说,用object关键字的实现才是最简洁、最符合语言习惯的方案。如果你的场景确实需要饿汉式的立即初始化(比如依赖某些必须提前加载的资源),那你的写法也没问题,但大部分业务场景下,object单例是更优的选择。

内容的提问来源于stack exchange,提问作者jackfield

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:39:57