前言
單利模式是寫代碼過程中不可避免用到的,下面我總結(jié)一下單利常用的五種寫法,話不多說了,來一起看看詳細(xì)的介紹吧
加載類時(shí)創(chuàng)建單利
Java實(shí)現(xiàn)
public class Config{ private static Config INSTANCE=new Config(); private Config(){ //構(gòu)造函數(shù) } public static Config getInstance(){ return INSTANCE; }}
Kotlin實(shí)現(xiàn)
object Config{}
上面這種寫法簡(jiǎn)單粗暴,直接在加載類的時(shí)候創(chuàng)建,但這樣會(huì)拖慢啟動(dòng)進(jìn)程,因此,可以在用到的時(shí)候再加載,比如下面這種寫法
懶加載寫法
Java實(shí)現(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實(shí)現(xiàn)
public class Config{ companion object{ val instance by lazy(LazyThreadSafetyMode.NONE){ Config() } }}
懶加載雖然避免在加載類的時(shí)候創(chuàng)建,但是線程不安全,如果同時(shí)多個(gè)類獲取單利,有可能會(huì)創(chuàng)建多個(gè)單利,因此可以在創(chuàng)建單利的時(shí)候加線程鎖,比如下面這種寫法:
同步鎖寫法
Java實(shí)現(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實(shí)現(xiàn)
class Config{ companion object{ private var instance:Config?=null @Synchronized fun get():Config{ if(nnull==instance) instance=Config() return instance } }}
同步鎖避免單利不會(huì)被重復(fù)創(chuàng)建,但是同步鎖
雙重校驗(yàn)寫法
Java實(shí)現(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實(shí)現(xiàn)
class Config{ companion object{ val instance by lazy(LazyThreadSafetyMode.SYNCHRONIZED){ Config() } }}
靜態(tài)內(nèi)部類寫法
這種寫法避免了類加載的時(shí)候初始化單利,同時(shí)將同步鎖問題交給虛擬機(jī)處理,算得上是最優(yōu)雅的寫法,Java和Kotlin寫法幾乎是一模一樣
Java實(shí)現(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實(shí)現(xiàn)
class Config private constructor(){ companion object{ fun getInstance = Helper.instance } private object Helper{ val instance = Config() }}
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)VeVb武林網(wǎng)的支持。
新聞熱點(diǎn)
疑難解答
圖片精選