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


  

相关推荐

  1. kotlin

    2024-01-09 04:24:01       38 阅读
  2. Kotlin模式(项目使用实例)

    2024-01-09 04:24:01       32 阅读
  3. 模式【C#】

    2024-01-09 04:24:01       37 阅读
  4. python模式

    2024-01-09 04:24:01       34 阅读
  5. 模式详解

    2024-01-09 04:24:01       39 阅读
  6. 模式学习

    2024-01-09 04:24:01       28 阅读
  7. 模式(C++)

    2024-01-09 04:24:01       33 阅读
  8. 设计模式

    2024-01-09 04:24:01       37 阅读
  9. 【C++ 模式】

    2024-01-09 04:24:01       36 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-09 04:24:01       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-09 04:24:01       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-09 04:24:01       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-09 04:24:01       18 阅读

热门阅读

  1. Android开发 基于ARouter开源的路由框架的YmRouter

    2024-01-09 04:24:01       38 阅读
  2. 与AI合作 -- 写一个modern c++单例工厂2

    2024-01-09 04:24:01       45 阅读
  3. 检查unity打包IOS包含dlopen的块

    2024-01-09 04:24:01       30 阅读
  4. 面试经典150题(72-77)

    2024-01-09 04:24:01       34 阅读
  5. React Hooks之useState、useRef

    2024-01-09 04:24:01       50 阅读
  6. Mysql 中的常用命令

    2024-01-09 04:24:01       33 阅读
  7. 了解一下InternLM2

    2024-01-09 04:24:01       36 阅读
  8. linux 设备模型之类

    2024-01-09 04:24:01       29 阅读
  9. 复杂度分析-时间复杂度和空间复杂度

    2024-01-09 04:24:01       32 阅读
  10. mysql 通过 binglog 恢复数据

    2024-01-09 04:24:01       30 阅读