Kotlin 单例的五种写法

9,787 阅读2分钟

前言

单例模式在开发中经常被用到,下面我总结下单例常用的五种写法,包含 Javakotlin 代码。

加载类时创建单例

  • 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(INSTANCE == null){
            synchronized(Config.class){
                if(INSTANCE == null){
                     INSTSANCE = new Config();
                }
            }
        }
        return INSTANCE;
    }
}
  • kotlin实现
class Config{
    companion object{
        val instance by lazy(LazyThreadSafetyMode.SYNCHRONIZED){
            Config()
        }
    }
}

静态内部类写法

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

  • 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()
    }
}