Kotlin基础篇之单例模式

232 阅读2分钟

1、Java版本饿汉式与Kotlin版本饿汉式

Java版本

package s1;

//饿汉式
public class SingleTon {

    private static SingleTon instance = new SingleTon();

    public SingleTon() {
    }

    public static SingleTon getInstance() {
        return instance;
    }
}

Kotlin版本

//KT 饿汉式
object SingleTonKt

那么Kotlin转化里干了什么呢?

image.png

Kotlin在虚拟机里自动生成了INSTANCE,进行了初始化

2、Java版本懒汉式与Kotlin版本懒汉式

java版本

//Java懒汉式版本
public class SingleTon2 {

    private static SingleTon2 instance;

    public SingleTon2() {
    }

    public static SingleTon2 getInstance(){
        if (instance == null){
            instance = new SingleTon2();
        }
        return instance;
    }
}

Kotlin版本

//Kt没有静态概念,使用派生
class SingleTonKt2 {

    companion object{

        private var instance : SingleTonKt2?=null
            get() {
                if (field == null){
                    field = SingleTonKt2()
                }
                return field
            }
        fun getInstanceKt(): SingleTonKt2? = instance!!

    }

    fun show(){
        println("show")
    }

}

fun main() {
    SingleTonKt2.getInstanceKt()?.show()
}

那么Kotlin做了哪些呢?

image.png

可以看到,虚拟机自动生成了getInstance(),并且我们重写时候,会把getInstance()当参数进行返回

3、Java版本懒汉式与Kotlin版本懒汉式(线程安全)

Java版本

//安全懒汉式
public class SingleTon3 {

    private static SingleTon3 instance;

    public SingleTon3() {
    }

    public static synchronized SingleTon3 getInstance(){
        if (instance == null){
            instance = new SingleTon3();
        }
        return instance;
    }
}

Kotlin版本

class SingltTonKt3 private constructor(){

    companion object{

        private var instance : SingltTonKt3?=null
            get() {
                if (field == null){
                    field = SingltTonKt3()
                }
                return field
            }
        @Synchronized
        fun getInstanceKt(): SingltTonKt3? = instance!!

    }

}

image.png

此处的field = instance,加锁的注解,在虚拟机里会给我们在方法上加锁

4、Java版本懒汉式与Kotlin版本懒汉式(双重校验)

Java版本


//双重校验安全
public class SingleTon4 {

    private volatile static SingleTon4 instance;

    public SingleTon4() {
    }

    public static SingleTon4 getInstance(){
            if (instance == null){
                synchronized (SingleTon4.class){
                    instance = new SingleTon4();

                }
            }


        return instance;
    }
}

Kotlin版本

class SingleTonKt4 private constructor(){

    companion object{
        val instance2 : SingleTonKt4 by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED){ SingleTonKt4()}
    }

    fun show(){
        println("show")
    }

}

fun main(){
    SingleTonKt4.instance2.show()
}

那么,这个Kotlin在虚拟机里做了什么呢?

image.png

可以看到,生成的变量先使用懒加载的方式,然后通过LazyKt.lazy(),进去看看这个里面做了什么?

image.png

可以看到里面有三种,其中一种是含锁机制。

image.png

可以看到,也是锁的对象,进行安全机制的加载。

5、静态内部类实现的单例模式

class Singleton private constructor(){

    companion object{
        val instance = Holder.instance
    }

    private object Holder{
        val instance = Singleton()
    }
}