Kotlin实战指南七:单例模式
生活随笔
收集整理的這篇文章主要介紹了
Kotlin实战指南七:单例模式
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
轉載請標明出處:https://blog.csdn.net/zhaoyanjun6/article/details/87941461
本文出自【趙彥軍的博客】
單例模式
- 無參單例模式—線程安全
- 懶加載單例模式—線程安全
- 有參單例模式—線程安全
無參單例模式—線程安全
在 Java 中單例模式有很多種寫法,比如懶漢模式,惡漢模式。但是在 Kotlin 種的單例模式就簡單很多,用 object 修飾的類就是單例。
object User {var name: String? = nullfun run() {} }你們看,是不是簡單很多,我們把 kotlin 編譯成 java 代碼來看看
public final class User {@Nullableprivate static String name;public static final User INSTANCE;@Nullablepublic 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? = nullfun getInstance(arg: A): T {val i = instanceif (i != null) {return i}return synchronized(this) {val i2 = instanceif (i2 != null) {i2} else {val created = creator!!(arg)instance = createdcreator = nullcreated}}} }然后創建單例模式實體類
import android.content.Contextclass 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 methodpublic Manager(Context context, DefaultConstructorMarker $constructor_marker) {this(context);}public static final class Companion extends SingletonHolder {private Companion() {super((Function1)null.INSTANCE);}// $FF: synthetic methodpublic Companion(DefaultConstructorMarker $constructor_marker) {this();}} }個人微信號:zhaoyanjun125 , 歡迎關注
總結
以上是生活随笔為你收集整理的Kotlin实战指南七:单例模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Kotlin实战指南六:可空类型、非可空
- 下一篇: Kotlin实战指南八:高阶函数