自制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
相关产品推荐
相关产品推荐

