kotlin 单例四种写法

2020-01-03  本文已影响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
}
上一篇 下一篇

猜你喜欢

热点阅读