轉載請標明出處: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 , 歡迎關注