Kotlin单例的五种写法

作者: 土逗牛肉 | 来源:发表于2018-06-19 13:10 被阅读123次

前言

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


加载类时创建单例

  • 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中的单例模式与Java对比

    目前java中的单例模式有多种写法,kotlin中的写法更多一点,本篇会总结全部的到单例模式写法。 一、懒人写法(...

  • Kotlin——单例模式

    最近在写项目的同时也用到了单例模式,kotlin的单例还不是很会写,现在就总结下java写法对应的kotlin是如...

  • Kotlin中使用Dagger的坑

    1.注入的不同写法 2.@Name用法 单例 说明: kotlin 中 单例 使用 关键字 object, 但是 ...

  • kotlin学习笔记

    kotlin基础知识 基础语法 kotlin中的特殊语法 object创建匿名内部类的写法kotlin中声明单例的...

  • 浅谈kotlin和java的不同之处

    kotlin的数据类代替java的setter和getter写法。kotlin中的object代替java中的单例...

  • Kotlin 单例模式的几种写法

    单例 大家很熟悉了 Java里有double check的写法 还有就是静态内部类的写法,在kotlin中有这样几...

  • Kotlin单例模式多种写法大分析

    前言: 今天,在项目开发中,又运用到了单例模式另外一种Kotlin写法,于是决定记录下来,以供参考。 几种单例模式...

  • 快速上手 Kotlin 开发系列之伴生对象

    本节将介绍 Kotlin 中的访问修饰符、伴生对象以及推荐单例的写法。 访问修饰符 在 Kotlin 中有四种访问...

  • OC和Swift单例的写法

    一 、OC中单例的写法:1.普通单例的写法 2. 利用多线程来写单例 #pragma mark --- 普通单例写...

  • Kotlin 单例模式几种写法

    使用对象声明方式,该方式线程安全 使用companion object ,通过lazy 来实现线程安全 自己实现同...

网友评论

本文标题:Kotlin单例的五种写法

本文链接:https://www.haomeiwen.com/subject/lckqeftx.html