kotlin 单例

2024-01-08 19:30:43

1.使用伴生对象(companion object):

class Singleton private constructor() {

? ? companion object {
? ? ? ? private val instance: Singleton by lazy { Singleton() }

? ? ? ? fun getInstance(): Singleton {
? ? ? ? ? ? return instance
? ? ? ? }
? ? }

? ? // 其他类成员
}

获取实例

val instance = Singleton.getInstance()

这种方式提供了更多的灵活性,可以在伴生对象中定义一些其他的属性和方法

2.使用 object 关键字:

object Singleton {
? ? // 单例的属性和方法
}
获取实例

val instance = Singleton

这种方式简单明了,object 关键字会自动创建单例。可以直接通过 Singleton 访问单例的属性和方法。

3.使用 lazy 委托:

class Singleton private constructor() {

? ? companion object {
? ? ? ? val instance: Singleton by lazy { Singleton() }
? ? }

? ? // 其他类成员
}

获取实例

val instance = Singleton.instance

这种方式利用 lazy 委托,确保只有在首次访问 instance 属性时才会初始化单例。

4.使用 enum枚举类

enum class Singleton {
? ? INSTANCE;

? ? // 单例的属性和方法
}
获取实例

val instance = Singleton.INSTANCE

枚举类在 Kotlin 中可以用来创建单例,INSTANCE 就是这个单例的实例。

5.双重检查锁定

class Singleton private constructor() {

? ? companion object {
? ? ? ? @Volatile
? ? ? ? private var instance: Singleton? = null

? ? ? ? fun getInstance(): Singleton {
? ? ? ? ? ? return instance ?: synchronized(this) {
? ? ? ? ? ? ? ? instance ?: Singleton().also { instance = it }
? ? ? ? ? ? }
? ? ? ? }
? ? }

? ? // 其他类成员
}
?

获取实例
val instance = Singleton.getInstance()

这种方式在多线程环境下保证了懒加载的线程安全性,避免了每次获取实例都进行同步。

6.使用 Holder 模式:

class Singleton private constructor() {

? ? private object Holder {
? ? ? ? val INSTANCE = Singleton()
? ? }

? ? companion object {
? ? ? ? fun getInstance(): Singleton {
? ? ? ? ? ? return Holder.INSTANCE
? ? ? ? }
? ? }

? ? // 其他类成员
}

获取实例

val instance = Singleton.getInstance()

这种方式通过 Kotlin 的对象声明在 Holder 类中创建单例,确保了懒加载和线程安全性。

 

文章来源:https://blog.csdn.net/sunshine_0707/article/details/135393708
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。