Kotlin中單利常用的五種寫法
前言
單利模式是寫代碼過程中不可避免用到的,下面我總結(jié)一下單利常用的五種寫法,話不多說了,來一起看看詳細(xì)的介紹吧
加載類時創(chuàng)建單利
Java實現(xiàn)
public class Config{ private static Config INSTANCE=new Config(); private Config(){ //構(gòu)造函數(shù) } public static Config getInstance(){ return INSTANCE; } }
Kotlin實現(xiàn)
object Config{}
上面這種寫法簡單粗暴,直接在加載類的時候創(chuàng)建,但這樣會拖慢啟動進(jìn)程,因此,可以在用到的時候再加載,比如下面這種寫法
懶加載寫法
Java實現(xiàn)
public class Config{ private static Config INSTANCE; private Config(){ //構(gòu)造函數(shù) } public static Config getInstance(){ if(null==INSTANCE){ INSTSANCE=new Config(); } return INSTANCE; } }
Kotlin實現(xiàn)
public class Config{ companion object{ val instance by lazy(LazyThreadSafetyMode.NONE){ Config() } } }
懶加載雖然避免在加載類的時候創(chuàng)建,但是線程不安全,如果同時多個類獲取單利,有可能會創(chuàng)建多個單利,因此可以在創(chuàng)建單利的時候加線程鎖,比如下面這種寫法:
同步鎖寫法
Java實現(xiàn)
public class Config{ private static Config INSTANCE; private Config(){ //構(gòu)造函數(shù) } public static synchronized Config getInstance(){ if(null==INSTANCE){ INSTANCE=new Config(); } return INSTANCE; } }
Kotlin實現(xiàn)
class Config{ companion object{ private var instance:Config?=null @Synchronized fun get():Config{ if(nnull==instance) instance=Config() return instance } } }
同步鎖避免單利不會被重復(fù)創(chuàng)建,但是同步鎖
雙重校驗寫法
Java實現(xiàn)
public class Config{ private static volatile Config INSTANCE; private Config(){ //構(gòu)造函數(shù) } public static Config getInstance(){ if(null==INSTANCE){ synchronized(Config.class){ if(null==INSTANCE){ INSTSANCE=new Config(); } } } return INSTANCE; } }
Kotlin實現(xiàn)
class Config{ companion object{ val instance by lazy(LazyThreadSafetyMode.SYNCHRONIZED){ Config() } } }
靜態(tài)內(nèi)部類寫法
這種寫法避免了類加載的時候初始化單利,同時將同步鎖問題交給虛擬機(jī)處理,算得上是最優(yōu)雅的寫法,Java和Kotlin寫法幾乎是一模一樣
Java實現(xiàn)
public class Config{ private static class Helper{ private static Config INSTANCE=new Config(); } private Config(){ //構(gòu)造函數(shù) } public static Config getInstance(){ return Helper.INSTANCE; } }
Kotlin實現(xiàn)
class Config private constructor(){ companion object{ fun getInstance = Helper.instance } private object Helper{ val instance = Config() } }
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
Android如何禁止向EditText控件中輸入內(nèi)容詳解
EditText是接受用戶輸入信息的最重要控件。下面這篇文章主要給大家介紹了關(guān)于Android如何禁止向EditText控件中輸入內(nèi)容的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來一起看看吧。2017-09-09Native.js獲取監(jiān)聽開關(guān)等操作Android藍(lán)牙設(shè)備實例代碼
本文為大家分享了Native.js對Android藍(lán)牙設(shè)備的操作實例代碼包括:監(jiān)聽藍(lán)牙開關(guān)狀態(tài),開啟關(guān)閉藍(lán)牙,獲取藍(lán)牙設(shè)備列表,藍(lán)牙連接票據(jù)打印機(jī)2018-09-09Android開發(fā)中實現(xiàn)發(fā)送短信的小程序示例
這篇文章主要介紹了Android開發(fā)中實現(xiàn)發(fā)送短信的小程序示例,文中還附帶了一個監(jiān)聽廣播接收者的升級版短信發(fā)送例子,需要的朋友可以參考下2016-04-04Android Studio 3.6 調(diào)試 smali的全過程
這篇文章主要介紹了Android Studio 3.6 調(diào)試 smali, 目前最新版的 Android Studio 利用附加功能調(diào)試 smali 非常方便,具體操作步驟跟隨小編一起看看吧2020-02-02Input系統(tǒng)之InputReader處理合成事件詳解
這篇文章主要為大家介紹了Input系統(tǒng)之InputReader處理合成事件詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11Android啟動頁廣告(騰訊廣告聯(lián)盟)解決方法及源碼下載
這篇文章主要介紹了Android啟動頁廣告(騰訊廣告聯(lián)盟)解決方法的相關(guān)資料,啟動頁幾乎成為了每個app的標(biāo)配,有些商家在啟動頁中增加了開屏廣告以此帶來更多的收入,需要的朋友可以參考下2017-03-03詳解Android應(yīng)用開發(fā)中Intent的作用及使用方法
這篇文章主要介紹了Android應(yīng)用開發(fā)中Intent的作用與用法,包括如何激活A(yù)ctivity組件與Intent的投遞等,需要的朋友可以參考下2016-03-03