Kotlin 单例模式

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/mengks1987/article/details/84141049

Kotlin 中创建单例模式模式有如下几种模式:

1、object

object Single1 {
    fun add(){}
}

用object做关键字就是一个单例,我们看下对应的Java代码:

public final class Single1 {
   public static final Single1 INSTANCE;

   public final void add() {
   }

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

我们发现这就是典型的饿汉式单例,在类加载的时候就进行了初始化,没有懒加载。

2、双验证方式

双验证的单例模式:

class SingletonJava private constructor() {
    companion object {
        @Volatile
        private var mInstance: SingletonJava? = null

        val instance: SingletonJava?
            get() {
                if (mInstance == null) {
                    synchronized(SingletonJava::class.java) {
                        if (mInstance == null) {
                            mInstance = SingletonJava()
                        }
                    }
                }
                return mInstance
            }
    }
}

由于Kotlin中没有 static关键字,所以静态方法放在companion object{}中,
我们看下这段Kotlin代码转为Java:

public final class SingletonJava {
   private static volatile SingletonJava mInstance;
   public static final SingletonJava.Companion Companion = new SingletonJava.Companion((DefaultConstructorMarker)null);

   public final void add() {
   }

   private SingletonJava() {
   }

   // $FF: synthetic method
   public SingletonJava(DefaultConstructorMarker $constructor_marker) {
      this();
   }
   public static final class Companion {
      @Nullable
      public final SingletonJava getInstance() {
         if (SingletonJava.mInstance == null) {
            Class var1 = SingletonJava.class;
            synchronized(var1){}

            try {
               if (SingletonJava.mInstance == null) {
                  SingletonJava.mInstance = new SingletonJava((DefaultConstructorMarker)null);
               }

               Unit var3 = Unit.INSTANCE;
            } finally {
               ;
            }
         }

         return SingletonJava.mInstance;
      }

      private Companion() {
      }

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

3、静态内部类

静态内部类方式实现的单例模式

class Singleton1 private constructor() {
    private object SingletonInstance {
         val INSTANCE = Singleton1()
    }

    companion object {
        val instance: Singleton1
            get() = SingletonInstance.INSTANCE
    }
}

总结:
1、第一种方式(object)写法简单但没有懒加载机制。
2、第2、3中方式是java中我们常用的单例模式,推荐使用,但更推荐使用第3种方式,第2种方式每次获取实例的时候会判断实例是否存在,仍然需要一些开销。
3、其实单例模式只要做到懒加载、线程安全、一个实例 这3点就ok了

猜你喜欢

转载自blog.csdn.net/mengks1987/article/details/84141049