Kotlin实战指南七:单例模式

转载请标明出处:https://blog.csdn.net/zhaoyanjun6/article/details/87941461
本文出自【赵彦军的博客】


无参单例模式—线程安全

在 Java 中单例模式有很多种写法,比如懒汉模式,恶汉模式。但是在 Kotlin 种的单例模式就简单很多,用 object 修饰的类就是单例。

object User {
    var name: String? = null

    fun run() {
    }
}

你们看,是不是简单很多,我们把 kotlin 编译成 java 代码来看看

public final class User {
   @Nullable
   private static String name;
   public static final User INSTANCE;

   @Nullable
   public final String getName() {
      return name;
   }

   public final void setName(@Nullable String var1) {
      name = var1;
   }

   public final void run() {
   }

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

可以看到 User 类中有 INSTANCE 实例,用 static 静态代码块包裹,在第一次使用的时候初始化。

那么这个单例模式怎么使用呢?

在 kotlin 中使用

User.name = "赵彦军"    //调用成员变量
User.run()    //调用成员函数

在 Java 中使用也很简单,但是不能像 kotlin 中那些直接调用,需要加一个 INSTANCE

//调用成员变量
User.INSTANCE.setName("zhaoyanjun");
User.INSTANCE.getName();

//调用成员函数
User.INSTANCE.run();

懒加载单例模式—线程安全

class Manager private constructor() {

    companion object {
        val instance by lazy {
            Manager()
        }
    }

    fun run() {
        //running now 
    } 
}

使用方式

//kotlin 版本
Manager.instance.run()

//java版本
Manager.Companion.getInstance().run();

有参单例模式—线程安全

首先创建单例模式工具类 SingletonHolder

open class SingletonHolder<out T: Any, in A>(creator: (A) -> T) {

    private var creator: ((A) -> T)? = creator
    @Volatile private var instance: T? = null

    fun getInstance(arg: A): T {
        val i = instance
        if (i != null) {
            return i
        }

        return synchronized(this) {
            val i2 = instance
            if (i2 != null) {
                i2
            } else {
                val created = creator!!(arg)
                instance = created
                creator = null
                created
            }
        }
    }
}

然后创建单例模式实体类

import android.content.Context

class Manager private constructor(context: Context) {

    init {
        // Init using context argument
    }

    companion object : SingletonHolder<Manager, Context>(::Manager)

    fun run() {
        //running now 
    }
}

使用方式

//kotlin 版本
Manager.getInstance(baseContext).run()

//java版本
 Manager.Companion.getInstance(context).run();

反编译代码

import android.content.Context;
import kotlin.Metadata;
import kotlin.jvm.functions.Function1;
import kotlin.jvm.internal.DefaultConstructorMarker;
public final class Manager {
   public static final Manager.Companion Companion = new Manager.Companion((DefaultConstructorMarker)null);

   public final void run() {
   }

   private Manager(Context context) {
   }

   // $FF: synthetic method
   public Manager(Context context, DefaultConstructorMarker $constructor_marker) {
      this(context);
   }

   public static final class Companion extends SingletonHolder {
      private Companion() {
         super((Function1)null.INSTANCE);
      }

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


个人微信号:zhaoyanjun125 , 欢迎关注

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章