Kotlin单例的五种写法

前言

单例模式是写代码过程中不可避免用到的,下面我总结一下单例常用的五中写法


加载类时创建单例

  • Java实现
public class Config{
    private static Config INSTANCE=new Config();
    private Config(){
    //构造函数
    }
    public static Config getInstance(){
        return INSTANCE;
    }
}
  • Kotlin实现
object Config{}

上面这种写法简单粗暴,直接在加载类的时候创建,但这样会拖慢启动进程,因此,可以在用到的时候再加载,比如下面这种写法

懒加载写法

  • Java实现
public class Config{
    private static Config INSTANCE;
    private Config(){
    //构造函数
    }
    public static Config getInstance(){
        if(null==INSTANCE){
            INSTSANCE=new Config();
        }
        return INSTANCE;
    }
}
  • Kotlin实现
public class Config{
    companion object{
        val instance by lazy(LazyThreadSafetyMode.NONE){
            Config()
        }
    }
}

懒加载虽然避免在加载类的时候创建,但是线程不安全,如果同时多个类获取单例,有可能会创建多个单例,因此可以在创建单例的时候加线程锁,比如下面这种写法:

同步锁写法

  • Java实现
public class Config{
    private static Config INSTANCE;
    private Config(){
    //构造函数
    }
    public static synchronized Config getInstance(){
        if(null==INSTANCE){
            INSTANCE=new Config();
        }
        return INSTANCE;
    }
}
  • Kotlin实现
class Config{
     companion object{
        private var instance:Config?=null
        @Synchronized
        fun get():Config{
            if(nnull==instance) instance=Config()
            return instance
        }
     }
}

同步锁避免单例不会被重复创建,但是同步锁

双重校验写法

  • Java实现
public class Config{
    private static volatile Config INSTANCE;
    private Config(){
    //构造函数
    }
    public static Config getInstance(){
        if(null==INSTANCE){
            synchronized(Config.class){
                if(null==INSTANCE){
                     INSTSANCE=new Config();
                }
            }
        }
        return INSTANCE;
    }
}
  • Kotlin实现
class Config{
    companion object{
        val instance by lazy(LazyThreadSafetyMode.SYNCHRONIZED){
            Config()
        }
    }
}

静态内部类写法

这种写法避免了类加载的时候初始化单例,同时将同步锁问题交给虚拟机处理,算得上是最优雅的写法,Java和Kotlin写法几乎是一模一样

  • Java实现
public class Config{
    private static class Helper{
        private static Config INSTANCE=new Config();
    }
    private Config(){
    //构造函数
    }
    public static Config getInstance(){
        return Helper.INSTANCE;
    }
}
  • Kotlin实现
class Config private constructor(){
    companion object{
        fun getInstance = Helper.instance
    }
    private object Helper{
        val instance = Config()
    }
}

你可能感兴趣的:(Kotlin单例的五种写法)