kotlin 单例

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 类中创建单例,确保了懒加载和线程安全性。

复制代码
相关推荐
SomeOtherTime2 小时前
Rust所有权(AI回答)
开发语言·后端·rust
Easyhood2 小时前
Android 开发入门实践(十四):Compose 副作用入门与四个常用 API
android·开发语言·kotlin·android jetpack·compose
白杨尚青3 小时前
C++进阶篇(六):map 和 set 的模拟实现——用红黑树封装 mymap/myset(迭代器 + operator[])
开发语言·c++·迭代器·stl·set·map·红黑树
饮水桶_T7 小时前
JAVA IO流笔记
开发语言·数据结构·算法
Felven9 小时前
C. Brr Brrr Patapim
c语言·开发语言
路溪非溪10 小时前
python标准库使用总结
开发语言·python
SomeOtherTime12 小时前
Rust 面向对象介绍(AI回答)
开发语言·python·rust
松仔log12 小时前
Kotlin中级——callbackFlow
java·前端·kotlin
zh_xuan12 小时前
kotlin常见面试题
开发语言·kotlin·面试题
mmsx12 小时前
耳切法切带洞多边形:论文能跑通,真实数据为什么崩
android·kotlin