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 , 歡迎關注

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