kotlin - 实现静态单例的方式

前文带着大家看过 kotlin 实现 static 的集中方式,那么非常自然的,我们就会想到用 kotlin 实现静态单例应该怎么做,怎么做比较优雅

其实大家基本都可以想法的到,不管怎么我们都离不开 companion object 的,记住 companion object 只是生成了一个类中的静态内部类,作用只是衔接,自身不和我们写的类产生其他联系,根本我们还是要在 companion object 内部创建静态实例对象,方式也是2种,懒汉式和饿汉式,懒汉式代码上没有 java 那么繁琐,kotlin 直接提供了双重同步锁

直接看代码:

class BookKotlin {

    fun speak() {}

    companion object instance {

        // 懒汉式,使用 LazyThreadSafetyMode.SYNCHRONIZED 双重同步锁
        val one: BookKotlin by lazy(LazyThreadSafetyMode.SYNCHRONIZED) {
            BookKotlin()
        }

        // 饿汉式,上来直接赋值
        @JvmField
        val two: BookKotlin = BookKotlin()

    }
}
kotlin 中可以直接使用这2中方式的静态单例
java 中可以直接使用饿汉式声明的静态单例
java 中懒汉式声明的静态单例需要借助中介才能使用
public final class BookKotlin {

   @JvmField
   public static final BookKotlin two;
   private static final Lazy one$delegate;
   public static final BookKotlin.instance instance = new BookKotlin.instance((DefaultConstructorMarker)null);

   public final void speak() {
   }

   static {
      one$delegate = LazyKt.lazy(LazyThreadSafetyMode.SYNCHRONIZED, (Function0)null.INSTANCE);
      two = new BookKotlin();
   }


   public static final class instance {
      // $FF: synthetic field
      static final KProperty[] $$delegatedProperties = new KProperty[]{(KProperty)Reflection.property1(new PropertyReference1Impl(Reflection.getOrCreateKotlinClass(BookKotlin.instance.class), "one", "getOne()Lcom/bloodcrown/kotlintest/BookKotlin;"))};

      public final BookKotlin getOne() {
         Lazy var1 = BookKotlin.one$delegate;
         KProperty var3 = $$delegatedProperties[0];
         return (BookKotlin)var1.getValue();
      }

      private instance() {
      }

      // $FF: synthetic method
      public instance(DefaultConstructorMarker $constructor_marker) {
         this();
      }
   }
}

代码很简单,大家一看就懂,同步的部分涉及 kotlin 自身机制不再这里说明

最后吐槽,本文算的上我最短小的技术文章发了吧,但是希望大家觉得他虽短小单精悍,短就忍了,再不精悍那就不是男人了 ~

最后妹子镇楼,最近就图多,搂下的都是好图


©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容