Kotlin單例模式

前言

前三篇主要講了下Kotlin語言的基本用法,以后在寫關(guān)于Kotlin文章的時候可以java和Kotlin一起寫,對比起來看會比較好。這篇文章主要講一下Kotlin中單例模式的用法,主要以代碼為主。

1.餓漢式

java的寫法比較簡單

public class SingletonJ {

    public static SingletonJ singletonJ = new SingletonJ();

    public static SingletonJ getInstance() {
        return singletonJ;
    }

}

Kotlin自帶單例,如下創(chuàng)建就行


1563717483(1).jpg
object SingletonK {
}

查看Kotlin字節(jié)碼發(fā)現(xiàn)其實(shí)原理都是一樣的


1563717622(1).jpg

2.懶漢式

public class SingletonJ {

    public static SingletonJ singletonJ;

    public static SingletonJ getInstance() {
        if (singletonJ == null)
            singletonJ = new SingletonJ();
        return singletonJ;
    }

}

Kotlin的寫法比較多,可以直接從java翻譯,還有一種寫法就有點(diǎn)復(fù)雜了,私有構(gòu)造函數(shù),我們也用到了他的get()方法。注意:companion object 修飾為伴生對象,伴生對象在類中只能存在一個,類似于java中的靜態(tài)方法 Java 中使用類訪問靜態(tài)成員,靜態(tài)方法。

class SingletonKK private constructor(){
    companion object {
        private var singletonKK : SingletonKK? = null
        get() {
            if (field == null)
                field = SingletonKK()
            return field;
        }
        fun get() : SingletonKK? {
            return singletonKK
        }
    }
}

創(chuàng)建的時候直接可以

var instance:SingletonKK = SingletonKK.get()!!

當(dāng)然還有一種簡便的實(shí)現(xiàn)方式,LazyThreadSafetyMode.NONE線程非安全

class SingletonLazy private constructor(){
    companion object {
        val Instance by lazy(mode = LazyThreadSafetyMode.NONE) {
            SingletonLazy()
        }
    }
}

3.線程安全的懶漢式

java中實(shí)現(xiàn)線程安全用到了synchronized,可以是方法鎖,也可以用對象鎖

public class SingletonJ {

    public static SingletonJ singletonJ;

    public static synchronized SingletonJ getInstance() {
        if (singletonJ == null)
            singletonJ = new SingletonJ();
        return singletonJ;
    }

}

Kotlin直接聲明@Synchronized為同步就行

class SingletonKK private constructor(){
    companion object {
        private var singletonKK : SingletonKK? = null
            get() {
                if (field == null)
                    field = SingletonKK()
                return field;
            }
        @Synchronized
        fun get() : SingletonKK? {
            return singletonKK
        }
    }
}

4.線程安全雙重校驗(yàn)

public class SingletonJ {

    private static volatile SingletonJ singletonJ;

    public static SingletonJ getInstance() {
        if (singletonJ == null) {
            synchronized (SingletonJ.class) {
                if (singletonJ == null)
                    singletonJ = new SingletonJ();
            }
        }
        return singletonJ;
    }

}

LazyThreadSafetyMode.SYNCHRONIZED即鎖的意思

class SingletonLazy private constructor(){
    companion object {
        val Instance by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) {
            SingletonLazy()
        }
    }
}

5.靜態(tài)內(nèi)部類

public class SingletonJ {

    private static class SingletonHolder{
        private static SingletonJ instance=new SingletonJ();
    }

    private SingletonJ(){
    }

    public static SingletonJ getInstance(){
        return SingletonHolder.instance;
    }
}
class SingletonLazy private constructor(){
    companion object {
        fun getInstance()= SingletonHolder.ins
    }

    private object SingletonHolder{
        var ins = SingletonLazy()
    }
}

結(jié)語

由于Kotlin自身語法簡潔的優(yōu)勢,寫單例模式也就一兩行的代碼,這里沒有深究一些高級用法,比如Lazy,屬于Kotlin延遲屬性的委托,有興趣的可以自己研究下。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容