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