美文网首页
kotlin 单例四种写法

kotlin 单例四种写法

作者: 折剑游侠 | 来源:发表于2020-01-03 09:49 被阅读0次
1. 饿汉式
object Singleton {
}

反编译成java

public final class Singleton {
   public static final Singleton INSTANCE;

   private Singleton() {
   }

   static {
      Singleton var0 = new Singleton();
      INSTANCE = var0;
   }
}

静态变量,static块中初始化

2. 懒汉式
class Singleton {
    val singleton: Singleton by lazy {
        Singleton()
    }
}

by lazy默认实现是线程安全的

public actual fun <T> lazy(initializer: () -> T): Lazy<T> = SynchronizedLazyImpl(initializer)

public actual fun <T> lazy(mode: LazyThreadSafetyMode, initializer: () -> T): Lazy<T> =
    when (mode) {
        LazyThreadSafetyMode.SYNCHRONIZED -> SynchronizedLazyImpl(initializer)
        LazyThreadSafetyMode.PUBLICATION -> SafePublicationLazyImpl(initializer)
        LazyThreadSafetyMode.NONE -> UnsafeLazyImpl(initializer)
    }

SynchronizedLazyImpl

private class SynchronizedLazyImpl<out T>(initializer: () -> T, lock: Any? = null) : Lazy<T>, Serializable {
    private var initializer: (() -> T)? = initializer
    @Volatile private var _value: Any? = UNINITIALIZED_VALUE
    // final field is required to enable safe publication of constructed instance
    private val lock = lock ?: this

    override val value: T
        get() {
            val _v1 = _value
            if (_v1 !== UNINITIALIZED_VALUE) {
                @Suppress("UNCHECKED_CAST")
                return _v1 as T
            }

            return synchronized(lock) {
                val _v2 = _value
                if (_v2 !== UNINITIALIZED_VALUE) {
                    @Suppress("UNCHECKED_CAST") (_v2 as T)
                } else {
                    val typedValue = initializer!!()
                    _value = typedValue
                    initializer = null
                    typedValue
                }
            }
        }

    override fun isInitialized(): Boolean = _value !== UNINITIALIZED_VALUE

    override fun toString(): String = if (isInitialized()) value.toString() else "Lazy value not initialized yet."

    private fun writeReplace(): Any = InitializedLazyImpl(value)
}

熟悉的volatile和synchronized

3. 静态内部类
class Singleton {
    companion object {
        fun getInstance() = Helper.instance
    }

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

反编译成java

public final class Singleton {
   public static final Singleton.Companion Companion = new Singleton.Companion((DefaultConstructorMarker)null);

   private static final class Helper {
      @NotNull
      private static final Singleton instance;
      public static final Singleton.Helper INSTANCE;

      @NotNull
      public final Singleton getInstance() {
         return instance;
      }

      static {
         Singleton.Helper var0 = new Singleton.Helper();
         INSTANCE = var0;
         instance = new Singleton();
      }
   }

   public static final class Companion {
      @NotNull
      public final Singleton getInstance() {
         return Singleton.Helper.INSTANCE.getInstance();
      }

      private Companion() {
      }

      public Companion(DefaultConstructorMarker $constructor_marker) {
         this();
      }
   }
}

Helper静态内部类初始化了单例,Companion提供getInstance方法。

4. 枚举
enum class Singleton {
    INSTANCE
}

相关文章

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

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

  • kotlin 单例四种写法

    1. 饿汉式 反编译成java 静态变量,static块中初始化 2. 懒汉式 by lazy默认实现是线程安全的...

  • Kotlin中的单例模式与Java对比

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

  • Java四种单例设计模式

    Java中的四种单例模式 单例模式是最容易理解的设计模式之一,介绍Java中单例模式的四种写法。 1.基本单例模式...

  • Kotlin中使用Dagger的坑

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

  • Kotlin——单例模式

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

  • kotlin学习笔记

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

  • 浅谈kotlin和java的不同之处

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

  • Kotlin 单例模式的几种写法

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

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

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

网友评论

      本文标题:kotlin 单例四种写法

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