亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > 綜合 > 正文

Kotlin中的5種單例模式示例詳解

2024-07-21 23:03:49
字體:
來源:轉載
供稿:網友

前言

最近在學習Kotlin這門語言,在項目開發中,運用到了單例模式。因為其表達方式與Java是不同的。所以對不同單例模式的實現進行了分別探討。主要單例模式實現如下:

  • 餓漢式
  • 懶漢式
  • 線程安全的懶漢式
  • 雙重校驗鎖式
  • 靜態內部類式

PS:該篇文章不討論單例模式的運用場景與各種模式下的單例模式的優缺點。只討論在Java下不同單例模式下的對應Kotlin實現。

一、餓漢式實現

//Java實現public class SingletonDemo { private static SingletonDemo instance=new SingletonDemo(); private SingletonDemo(){ } public static SingletonDemo getInstance(){ return instance; }}//Kotlin實現object SingletonDemo

這里很多小伙伴,就吃了一驚。我靠一個object 關鍵字就完成相同的功能?一行代碼?

Kotlin的對象聲明

學習了Kotlin的小伙伴肯定知道,在Kotlin中類沒有靜態方法。如果你需要寫一個可以無需用一個類的實例來調用,但需要訪問類內部的函數(例如,工廠方法,單例等),你可以把該類聲明為一個對象。該對象與其他語言的靜態成員是類似的。如果你想了解Kotlin對象聲明的更多內容。請點擊- - - 傳送門

到這里,如果還是有很多小伙伴不是很相信一行代碼就能解決這個功能,我們可以通過一下方式查看Kotlin的字節碼。

查看Kotlin對應字節碼

Kotlin,單例模式

我們進入我們的Android Studio(我的Android Studio 3.0,如果你的編譯器版本過低,請自動升級) 選擇Tools工具欄,選擇"Kotlin",選擇“Show Kotlin Bytecode"

選擇過后就會進入到下方界面:

Kotlin,單例模式

點擊"Decompile" 根據字節碼得到以下代碼

public final class SingletonDemo { public static final SingletonDemo INSTANCE; private SingletonDemo(){} static { SingletonDemo var0 = new SingletonDemo(); INSTANCE = var0; }}

通過以上代碼,我們了解事實就是這個樣子的,使用Kotlin"object"進行對象聲明與我們的餓漢式單例的代碼是相同的。

二、懶漢式

//Java實現public class SingletonDemo { private static SingletonDemo instance; private SingletonDemo(){} public static SingletonDemo getInstance(){ if(instance==null){  instance=new SingletonDemo(); } return instance; }}//Kotlin實現class SingletonDemo private constructor() { companion object { private var instance: SingletonDemo? = null  get() {  if (field == null) {   field = SingletonDemo()  }  return field  } fun get(): SingletonDemo{ //細心的小伙伴肯定發現了,這里不用getInstance作為為方法名,是因為在伴生對象聲明時,內部已有getInstance方法,所以只能取其他名字  return instance!! } }}

上述代碼中,我們可以發現在Kotlin實現中,我們讓其主構造函數私有化并自定義了其屬性訪問器,其余內容大同小異。

如果有小伙伴不清楚Kotlin構造函數的使用方式。請點擊 - - - 構造函數
不清楚Kotlin的屬性與訪問器,請點擊 - - -屬性和字段

三、線程安全的懶漢式

//Java實現public class SingletonDemo { private static SingletonDemo instance; private SingletonDemo(){} public static synchronized SingletonDemo getInstance(){//使用同步鎖  if(instance==null){   instance=new SingletonDemo();  }  return instance; }}//Kotlin實現class SingletonDemo private constructor() { companion object {  private var instance: SingletonDemo? = null   get() {    if (field == null) {     field = SingletonDemo()    }    return field   }  @Synchronized  fun get(): SingletonDemo{   return instance!!  } }}

大家都知道在使用懶漢式會出現線程安全的問題,需要使用使用同步鎖,在Kotlin中,如果你需要將方法聲明為同步,需要添加**@Synchronized**注解。

四、雙重校驗鎖式(Double Check)

//Java實現public class SingletonDemo { private volatile static SingletonDemo instance; private SingletonDemo(){}  public static SingletonDemo getInstance(){  if(instance==null){   synchronized (SingletonDemo.class){    if(instance==null){     instance=new SingletonDemo();    }   }  }  return instance; }}//kotlin實現class SingletonDemo private constructor() { companion object {  val instance: SingletonDemo by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) {  SingletonDemo() } }}

哇!小伙伴們驚喜不,感不感動啊。我們居然幾行代碼就實現了多行的Java代碼。其中我們運用到了Kotlin的延遲屬性 Lazy。

Lazy是接受一個 lambda 并返回一個 Lazy 實例的函數,返回的實例可以作為實現延遲屬性的委托: 第一次調用 get() 會執行已傳遞給 lazy() 的 lambda 表達式并記錄結果, 后續調用 get() 只是返回記錄的結果。

這里還有有兩個額外的知識點。

  • 高階函數,高階函數是將函數用作參數或返回值的函數(我很糾結我到底講不講,哎)。大家還是看這個 ---高階函數
  • 委托屬性

如果你了解以上知識點,我們直接來看Lazy的內部實現。

Lazy內部實現

public fun <T> lazy(mode: LazyThreadSafetyMode, initializer: () -> T): Lazy<T> =  when (mode) {   LazyThreadSafetyMode.SYNCHRONIZED -> SynchronizedLazyImpl(initializer)   LazyThreadSafetyMode.PUBLICATION -> SafePublicationLazyImpl(initializer)   LazyThreadSafetyMode.NONE -> UnsafeLazyImpl(initializer)  }

觀察上述代碼,因為我們傳入的mode = LazyThreadSafetyMode.SYNCHRONIZED,
那么會直接走 SynchronizedLazyImpl,我們繼續觀察SynchronizedLazyImpl。

Lazy接口

SynchronizedLazyImpl實現了Lazy接口,Lazy具體接口如下:

public interface Lazy<out T> {  //當前實例化對象,一旦實例化后,該對象不會再改變 public val value: T //返回true表示,已經延遲實例化過了,false 表示,沒有被實例化, //一旦方法返回true,該方法會一直返回true,且不會再繼續實例化 public fun isInitialized(): Boolean}

繼續查看SynchronizedLazyImpl,具體實現如下:

SynchronizedLazyImpl內部實現

private class SynchronizedLazyImpl<out T>(initializer: () -> T, lock: Any? = null) : Lazy<T>, Serializable { private var initializer: (() -> T)? = initializer @Volatile private var _value: Any? = UNINITIALIZED_VALUE // final field is required to enable safe publication of constructed instance private val lock = lock ?: this override val value: T  get() {   val _v1 = _value   //判斷是否已經初始化過,如果初始化過直接返回,不在調用高級函數內部邏輯   if (_v1 !== UNINITIALIZED_VALUE) {    @Suppress("UNCHECKED_CAST")    return _v1 as T   }   return synchronized(lock) {    val _v2 = _value    if (_v2 !== UNINITIALIZED_VALUE) {     @Suppress("UNCHECKED_CAST") (_v2 as T)    }    else {     val typedValue = initializer!!()//調用高級函數獲取其返回值     _value = typedValue //將返回值賦值給_value,用于下次判斷時,直接返回高級函數的返回值     initializer = null     typedValue     }   }  } //省略部分代碼}

通過上述代碼,我們發現 SynchronizedLazyImpl 覆蓋了Lazy接口的value屬性,并且重新了其屬性訪問器。其具體邏輯與Java的雙重檢驗是類似的。

到里這里其實大家還是肯定有疑問,我這里只是實例化了SynchronizedLazyImpl對象,并沒有進行值的獲取,它是怎么拿到高階函數的返回值呢?。這里又涉及到了委托屬性。

委托屬性語法是: val/var <屬性名>: <類型> by <表達式>。在 by 后面的表達式是該 委托, 因為屬性對應的 get()(和 set())會被委托給它的 getValue() 和 setValue() 方法。 屬性的委托不必實現任何的接口,但是需要提供一個 getValue() 函數(和 setValue()——對于 var 屬性)。

而Lazy.kt文件中,聲明了Lazy接口的getValue擴展函數。故在最終賦值的時候會調用該方法。

@kotlin.internal.InlineOnly//返回初始化的值。public inline operator fun <T> Lazy<T>.getValue(thisRef: Any?, property: KProperty<*>): T = value

五、靜態內部類式

//Java實現public class SingletonDemo { private static class SingletonHolder{  private static SingletonDemo instance=new SingletonDemo(); } private SingletonDemo(){  System.out.println("Singleton has loaded"); } public static SingletonDemo getInstance(){  return SingletonHolder.instance; }}//kotlin實現class SingletonDemo private constructor() { companion object {  val instance = SingletonHolder.holder } private object SingletonHolder {  val holder= SingletonDemo() }}

靜態內部類的實現方式,也沒有什么好說的。Kotlin與Java實現基本雷同。

最后

附上我寫的一個基于Kotlin 仿開眼的項目SimpleEyes(ps: 其實在我之前,已經有很多小朋友開始仿這款應用了,但是我覺得要做就做好。所以我的項目和其他的人應該不同,不僅僅是簡單的一個應用。但是,但是。但是。重要的話說三遍。還在開發階段,不要打我),歡迎大家follow和start

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VeVb武林網的支持。


注:相關教程知識閱讀請移步到kotlin教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩精品在线播放| 精品亚洲精品福利线在观看| 国产精品日日摸夜夜添夜夜av| 国产精品com| 欧美日韩性视频在线| 国产在线98福利播放视频| 国产999在线观看| 九九久久久久99精品| 亚洲 日韩 国产第一| 中文字幕亚洲自拍| 国产精品影片在线观看| 国产日韩欧美在线视频观看| 国产欧美久久一区二区| 亚洲精品www久久久| 国产日韩精品在线观看| 日韩av影院在线观看| 成人乱色短篇合集| 日韩在线观看精品| 成人黄色av播放免费| 欧美黑人视频一区| 久久久久中文字幕| 亚洲女在线观看| 久久综合色影院| 亚洲剧情一区二区| 亚洲网在线观看| 九色精品美女在线| 亚洲成人久久一区| 成人精品一区二区三区电影黑人| 色综合天天综合网国产成人网| zzijzzij亚洲日本成熟少妇| 国产精品欧美日韩| 成人免费黄色网| 亚洲视频电影图片偷拍一区| 国产欧美精品xxxx另类| 久久久中文字幕| 亚洲最新av在线| 尤物yw午夜国产精品视频| 日韩视频第一页| 69久久夜色精品国产69乱青草| 97涩涩爰在线观看亚洲| 2019中文在线观看| 6080yy精品一区二区三区| 96精品视频在线| 国产一区二区丝袜| 国产成人精彩在线视频九色| 午夜精品久久久久久久久久久久| 欧美成人中文字幕| 日韩精品在线视频观看| 91精品成人久久| 久久久久五月天| 91久久嫩草影院一区二区| 久久久国产精彩视频美女艺术照福利| 日韩免费观看网站| 国外色69视频在线观看| 久久露脸国产精品| 日韩av在线一区二区| 日韩av成人在线| 国产情人节一区| 最近2019年中文视频免费在线观看| 亚洲尤物视频网| 日韩欧美综合在线视频| 欧美精品videofree1080p| 国产精品欧美亚洲777777| 4438全国亚洲精品在线观看视频| 国产精品444| 中文字幕亚洲综合| 在线播放亚洲激情| 色老头一区二区三区在线观看| 日韩欧美主播在线| 欧美黑人xxxⅹ高潮交| 91人人爽人人爽人人精88v| 欧美不卡视频一区发布| 亚洲美女视频网| 91探花福利精品国产自产在线| 色诱女教师一区二区三区| 国产视频亚洲精品| 亚洲一区二区三区乱码aⅴ| 2020欧美日韩在线视频| 国模精品一区二区三区色天香| 日韩欧美在线视频日韩欧美在线视频| 68精品国产免费久久久久久婷婷| 欧美一级成年大片在线观看| 欧美大片网站在线观看| 亚洲激情视频在线观看| 亚洲电影免费观看高清完整版在线观看| 姬川优奈aav一区二区| 欧美日韩福利视频| 亚洲激情自拍图| 日韩精品视频在线| 国产午夜精品麻豆| 亚洲人午夜精品免费| 91丝袜美腿美女视频网站| 国产主播欧美精品| 日韩欧美主播在线| 91av在线播放视频| 久久久亚洲网站| 亚洲第一精品夜夜躁人人爽| 日韩精品极品视频免费观看| 孩xxxx性bbbb欧美| 日韩黄色高清视频| 亚洲深夜福利视频| 日韩精品久久久久| 欧美日韩加勒比精品一区| 欧美在线一级va免费观看| 亚洲精品第一页| 国产成人精品在线播放| 欧美激情在线狂野欧美精品| 欧美与黑人午夜性猛交久久久| 亚洲国产精品电影| 中文字幕一区日韩电影| 国产精品极品尤物在线观看| 国产精品久久久久久久久久ktv| 久久精品国产亚洲7777| 亚洲欧美在线播放| 国产精品久久精品| 中文字幕久热精品在线视频| 国产伦精品免费视频| 在线观看国产精品91| 精品高清美女精品国产区| 欧美亚洲在线视频| 国产亚洲精品久久久| 成人妇女淫片aaaa视频| 一区二区在线视频播放| 亚洲人成电影在线播放| 欧美成人精品在线视频| 欧美性猛交xxxx富婆弯腰| 日韩电影视频免费| 日韩欧美精品中文字幕| 中文字幕自拍vr一区二区三区| 亚洲人成伊人成综合网久久久| 久久的精品视频| 九九视频这里只有精品| 国产一区二区在线免费视频| 亚洲一区二区三区四区在线播放| 高清亚洲成在人网站天堂| 亚洲欧美日韩成人| 久久久91精品国产一区不卡| 亚洲国产成人一区| 久久国产精品影视| 狠狠久久亚洲欧美专区| 中文字幕日韩av电影| 国产一区二区在线免费| 欧美成人h版在线观看| 国产精品福利在线观看| 国产成人精品视频在线| 久久国产精品视频| 亚洲精品欧美极品| 国产精品一二三视频| 中国人与牲禽动交精品| 国产成人精品综合| 欧美精品第一页在线播放| 欧洲成人免费视频| 日韩av最新在线观看| 亚洲男人天堂视频| 久久99精品视频一区97| 中文字幕日韩电影| 国产欧美精品一区二区三区介绍| 亚洲丝袜在线视频| 97香蕉久久超级碰碰高清版| 亚洲国产又黄又爽女人高潮的| 国产丝袜一区视频在线观看| 成人欧美一区二区三区在线湿哒哒| 国产成人av网址| 91精品国产91久久久久久久久|