在 Java 开发中的单例模式一般都是私有化构造并且使用静态字段持有这个类仅有的实例。但是在 Kotlin 中并没有 static 关键字,那么单例模式该如何实现呢?
1、Kotlin 通过使用 “对象声明”功能为这一切提供了最高级的语言支持。
什么是对象声明呢?对象声明将类的声明与该类的单一实例声明结合到一起,也就是说,你可以像声明一个类一样声明一个对象,这个对象在定义的时候就创造了,不需要在任何地方调用构造方法初始化,因此,对象声明没有构造方法,并且是唯一实例。
例如:
object User{ // 使用 object 关键字声明对象,高效的定义了 User 类和他的一个变量
val str = ""
fun printStr(){}
}
// 可以直接通过对象名.属性名/方法名 调用
User.INSTANCE.getStr()
User.INSTANCE.printStr()
Kotlin 中一个关键字"object"实现单例模式。
2、主要单例模式实现如下:
饿汉式
懒汉式
线程安全的懒汉式
双重校验锁式
静态内部类式
一、饿汉式实现
//Java实现
public class SingletonDemo {
private static SingletonDemo instance=new SingletonDemo();
private SingletonDemo(){
}
public static SingletonDemo getInstance(){
return instance;
}
}
//Kotlin实现
object SingletonDemo
二、懒汉式实现
//Java实现
public class SingletonDemo {
private static SingletonDemo instance;
private SingletonDemo(){}
public static SingletonDemo getInstance(){
if(instance==null){
instance=new SingletonDemo();
}
return instance;
}
}
//Kotlin实现
class SingletonDemoprivate constructor() {
companion object {
private var instance: SingletonDemo? =null
get() {
if (field ==null) {
field = SingletonDemo()
}
return field
}
fun get(): SingletonDemo{
//细心的小伙伴肯定发现了,这里不用getInstance作为为方法名,是因为在伴生对象声明时,内部已有getInstance方法,所以只能取其他名字
return instance!!
}
}
}
三、线程安全的懒汉式
//Java实现
public class SingletonDemo {
private static SingletonDemo instance;
private SingletonDemo(){}
public static synchronized SingletonDemo getInstance(){//使用同步锁
if(instance==null){
instance=new SingletonDemo();
}
return instance;
}
}
//Kotlin实现
class SingletonDemoprivate constructor() {
companion object {
private var instance: SingletonDemo? =null
get() {
if (field ==null) {
field = SingletonDemo()
}
return field
}
@Synchronized
fun get(): SingletonDemo{
return instance!!
}
}
}
四、双重校验锁式(Double Check)
//Java实现
public class SingletonDemo {
private volatile static SingletonDemo instance;
private SingletonDemo(){}
public static SingletonDemo getInstance(){
if(instance==null){
synchronized (SingletonDemo.class){
if(instance==null){
instance=new SingletonDemo();
}
}
}
return instance;
}
}
//kotlin实现
class SingletonDemoprivate constructor() {
companion object {
val instance: SingletonDemoby lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED){
SingletonDemo()}
}
}
补充:如何在Kotlin版的Double Check,给单例添加一个属性,这里我给大家提供了一个实现的方式。
class SingletonDemoprivate constructor(private val property: Int) {//这里可以根据实际需求发生改变
companion object {
@Volatile private var instance: SingletonDemo? =null
fun getInstance(property: Int) =
instance ?:synchronized(this){
instance ?: SingletonDemo(property).also { instance =it }
}
}
}
五、静态内部类式
//Java实现
public class SingletonDemo {
private staticclass SingletonHolder{
private static SingletonDemo instance=new SingletonDemo();
}
private SingletonDemo(){
System.out.println("Singleton has loaded");
}
public static SingletonDemo getInstance(){
return SingletonHolder.instance;
}
}
//kotlin实现
class SingletonDemoprivate constructor() {
companion object {
val instance = SingletonHolder.holder
}
private object SingletonHolder {
val holder= SingletonDemo()
}
}
网友评论