日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Kotlin实战指南七:单例模式

發布時間:2024/9/30 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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实战指南七:单例模式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。