-
传统的懒汉式静态内部类单例实现(Java风格在Kotlin中的体现)
class Singleton { private constructor() companion object { fun getInstance(): Singleton = InnerHolder.singleton } private object InnerHolder { val singleton: Singleton by lazy { Singleton() } } }代码说明:
- 首先,
Singleton类的构造函数是私有的,防止外部直接实例化。 - 在
companion object中提供了getInstance方法,该方法返回InnerHolder.singleton。 InnerHolder是一个私有的对象。其中singleton属性使用了by lazy委托。by lazy是Kotlin的延迟初始化特性,它会在第一次访问singleton时才创建Singleton实例,并且by lazy本身是线程安全的,在多线程环境下只会初始化一次。
- 首先,
-
另一种基于静态内部类延迟加载思想的实现
class Singleton private constructor() { companion object { private object Inner { val INSTANCE = Singleton() } fun getInstance(): Singleton = Inner.INSTANCE } }代码说明:
Singleton类构造函数同样是私有的。companion object中有一个私有的Inner对象。Inner对象在类加载时创建,但是其中的INSTANCE实例是在Inner对象被加载时才创建,而Inner对象在getInstance方法第一次调用时才会被加载,从而实现了懒加载。并且由于类加载机制,这种方式是线程安全的。
使用示例
fun main() {
val instance1 = Singleton.getInstance()
val instance2 = Singleton.getInstance()
println(instance1 === instance2) // 输出 true,表明是同一个实例
}
在这两种实现中,第一种使用 by lazy 更加显式地体现了懒加载的特性;第二种则利用了Kotlin对象和类加载机制来实现懒加载和线程安全,相对更加简洁。
当前文章价值4.51元,扫一扫支付后添加微信提供帮助!(如不能解决您的问题,可以申请退款)

评论已关闭!