Kotlin单例模式

1. 饿汉式
直接使用对象表达式object就可以方便的实现

object Singleton {
    ...
}

//调用时
Singleton.xxx

这种方式实际上是使用Java静态代码块在类加载时初始化类中INSTANCE静态对象实例

public final class Singleton {
    public static final Singleton INSTANCE = null;
    static {
        Singleton singleton = new Singleton();
    }
    private Singleton() {
        INSTANCE = this;
    }
}

所以在Java下调用时

Singleton.INSTANCE.xxx

2. 懒汉式

  • 构造时不传参数
    如果在对象构造时不需要传参数,那使用Kotlin标准库提供的延迟属性 Lazy可以很方便实现
class Singleton private constructor(){

    object Holder{
        val INSTANCE=Singleton()
    }

    companion object {
        val instance by lazy { 
            Holder.INSTANCE
        }
    }

    xxx
}


// Kotlin 中调用
Singleton.instance.xx()
// Java 中调用
Singleton.Companion.getInstance().xx()

延迟属性 Lazy 默认线程安全模式是 LazyThreadSafetyMode.SYNCHRONIZED,使用双重检验锁来保证线程安全

  • 构造时传参数
    上面两种方式都很方便,但都不能在获取单例时传入参数,如果想要传参数,可以在伴随对象中写方法自己保证线程安全,这里采用双重检验锁实现
class Singleton private constructor(arg: String){

    companion object {
        @Volatile private var instance: Singleton? = null
        
        public fun getInstance(arg: String): Singleton{
            if (instance == null) {
                synchronized(Singleton::class){
                    if (instance == null) {
                        instance=Singleton(arg)
                    }
                }
            }
            return instance!!
        }
    }
}

@Volatile为了防止指令重拍造成的影响

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容