kotlin单例模式
时间: 2023-07-05 15:08:21 浏览: 188
在 Kotlin 中,可以使用 `object` 关键字来定义单例对象,单例对象在应用程序中只有一个实例。
以下是一个使用单例模式的例子:
```kotlin
object MySingleton {
init {
println("Singleton class invoked.")
}
fun doSomething() {
println("Singleton class method called.")
}
}
fun main() {
MySingleton.doSomething() // 输出: Singleton class invoked. Singleton class method called.
}
```
在这个例子中,我们定义了一个名为 `MySingleton` 的单例对象,并在对象的构造函数中打印一条信息。我们还定义了一个名为 `doSomething()` 的方法,该方法可用于执行某些操作。
在 `main()` 函数中,我们直接调用 `MySingleton.doSomething()` 方法,并输出了两条信息。
注意,Kotlin 中的单例对象是线程安全的,并且可以在整个应用程序中进行共享和重用。
相关问题
kotlin 单例模式
Kotlin中的单例模式是一种设计模式,它保证一个类只有一个实例,并提供全局访问点。在Kotlin中,有几种常见的创建单例的方式:
1. **静态工厂方法**:
```kotlin
class Singleton {
companion object INSTANCE : Singleton() // 使用companion object来持有唯一实例
fun getInstance(): Singleton { return INSTANCE } // 获取该实例
}
```
这样做可以防止外部直接new Singleton,确保了只有一个实例。
2. **懒汉式单例(线程安全)**:
```kotlin
lazy val SINGLETON: Singleton = Singleton() // 使用lazy关键字保证只在第一次请求时初始化
```
3. **双重检查锁定**:
这种方式在多线程环境下更复杂一些,通过双重检查锁来实现线程安全:
```kotlin
private volatile var instance: Singleton? = null
fun getInstance(): Singleton {
if (instance == null) {
synchronized(this) {
if (instance == null) {
instance = Singleton()
}
}
}
return instance!!
}
```
其中`volatile`关键字确保了对`instance`的可见性和同步。
4. **构造函数私有化+内部类单例**:
```kotlin
class Singleton(private constructor()) { ... }
object SingletonObject : Singleton() // 内部类访问私有构造函数创建唯一实例
fun getInstance(): Singleton { return SingletonObject }
```
这种方式利用了Kotlin的特性,保证了构造函数不可见,提高了线程安全性。
kotlin 单例 参数
在Kotlin中,创建带有参数的单例可以通过使用内部类和高阶函数的组合来实现。一种常见的方法是使用一个泛型类SingletonHolder,它接受一个带有参数的lambda表达式作为构造函数参数。以下是一个示例代码:
```kotlin
open class SingletonHolder<out T : Any, in A>(private val creator: (A) -> T) {
private var instance: T? = null
fun getInstance(arg: A): T = instance ?: synchronized(this) {
instance ?: creator(arg).apply { instance = this }
}
}
class MySingleton private constructor(private val arg: String) {
init {
// 初始化代码
}
companion object : SingletonHolder<MySingleton, String>(::MySingleton)
}
```
在上述示例中,SingletonHolder是一个泛型类,它接受一个创建实例的lambda表达式作为构造函数参数。MySingleton类通过将构造函数参数传递给SingletonHolder的getInstance方法来获取单例实例。
要创建一个带有参数的单例,你可以将带有参数的构造函数定义为私有,并在伴生对象中使用SingletonHolder来获取实例。在这个例子中,MySingleton类的构造函数接受一个字符串参数arg,并且在初始化代码块中进行了初始化操作。
要获取MySingleton的单例实例,你可以调用MySingleton.Companion.getInstance(arg)方法,其中arg是你想要传递的参数。
请注意,这只是一种实现带有参数的单例模式的方法,还有其他的方法可以实现类似的功能。
阅读全文
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![md](https://img-home.csdnimg.cn/images/20250102104920.png)
![-](https://img-home.csdnimg.cn/images/20241231044930.png)
![-](https://img-home.csdnimg.cn/images/20241231044930.png)
![-](https://img-home.csdnimg.cn/images/20241231044930.png)
![-](https://img-home.csdnimg.cn/images/20241226111658.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)