Kotlin(1.1)學(xué)習(xí)筆記(4)——單例與伴生對(duì)象

單例

Kotlin中沒有static關(guān)鍵字,如果需要實(shí)現(xiàn)單例功能,
你可以使用關(guān)鍵字 object 聲明一個(gè)對(duì)象,對(duì)象的構(gòu)造器不能提供構(gòu)造器參數(shù);在第一次使用的時(shí)候會(huì)被初始化,可用于提供常量或共享不可變對(duì)象!具體可以仿照官網(wǎng)

單例模式是一種非常有用的模式,而 Kotlin(繼 Scala 之后)使單例聲明變得很容易:

object DataProviderManager {
    fun registerDataProvider(provider: DataProvider) {
        // ……
    }
    val allDataProviders: Collection<DataProvider>
        get() = // ……
}

這稱為對(duì)象聲明。并且它總是在 object 關(guān)鍵字后跟一個(gè)名稱。 就像變量聲明一樣,對(duì)象聲明不是一個(gè)表達(dá)式,不能用在賦值語(yǔ)句的右邊。
要引用該對(duì)象,我們直接使用其名稱即可:

object DefaultListener : MouseAdapter() {
    override fun mouseClicked(e: MouseEvent) {
        // ……
    }
    override fun mouseEntered(e: MouseEvent) {
        // ……
    }
}

注意:對(duì)象聲明不能在局部作用域(即直接嵌套在函數(shù)內(nèi)部),但是它們可以嵌套到其他對(duì)象聲明或非內(nèi)部類中。

不過我個(gè)人的習(xí)慣還是使用枚舉的方式

enum class Sington{
        mSington;

        fun usrSington(){}
    }

伴生對(duì)象

對(duì)想我這樣剛接觸kotlin的java程序員來說,伴生對(duì)象是一個(gè)陌生的概念。這幾天也一直在轉(zhuǎn)變思想。我的理解是這樣的:
雖然kotlin為了更好的面向?qū)ο笕∠藄tatic關(guān)鍵字,但是有時(shí)我們也需要在class一級(jí)作出一個(gè)寫操作,因?yàn)榇嗽趉otlin中出現(xiàn)了companion關(guān)鍵字。在

companion object{
    ......
}

數(shù)據(jù)塊中的屬性或者方法可以使用類.成員的方式調(diào)用(調(diào)用方式和static成員一致),但是他們?cè)谶\(yùn)行時(shí)依然是實(shí)體的實(shí)例成員

 class Singleton2 private constructor(){
        companion object{
            fun get(): Singleton2{
                return Inner2.instance
            }
        }

        private object  Inner2{
            val instance: Singleton2    = Singleton2()
        }
    }

如上面展示的那樣,我們使用伴生對(duì)象可以更好的和單例結(jié)合,這樣在調(diào)用單例的時(shí)候可以在我們想要獲得單例實(shí)例的時(shí)候再出初始化單例,保證了線程安全

objec,companion和const

剛開始學(xué)習(xí)kotlin的時(shí)候,可能會(huì)對(duì)companion object{}和const關(guān)鍵字弄混淆,這里我給出一點(diǎn)個(gè)人的理解:

  • Kotlin用對(duì)象表達(dá)式和對(duì)象聲明實(shí)現(xiàn)Java匿名內(nèi)部類這種情況,即匿名類的實(shí)現(xiàn)對(duì)象為object。
  • companion object{}伴生對(duì)象,雖然調(diào)用的時(shí)候類似static,但它依然是對(duì)象的實(shí)例成員,并且可以實(shí)現(xiàn)接口
    -const 編譯時(shí)常量。1.String或基本類型進(jìn)行初始化;2.沒有自定義getter;3對(duì)象成員或頂級(jí)(Top-level)。從實(shí)際上看,它更符合static final的常量

靜態(tài)變量

如果你硬是要搞成Java中的靜態(tài)成員和靜態(tài)方法的話,你可以用:

靜態(tài)成員:

  • @JvmField注解:生成與該屬性相同的靜態(tài)字段
  • lateinit關(guān)鍵字:延遲初始化(沒用過)
  • const()關(guān)鍵字:將 Kotlin 屬性轉(zhuǎn)換成 Java 中的靜態(tài)字段(定義常量用)

靜態(tài)方法:

  • @JvmStatic注解:在單例對(duì)象和伴生對(duì)象中生成對(duì)應(yīng)的靜態(tài)方法
    class StaticTest{
        companion object{
            const  val s= ""
            @JvmStatic fun test() = print(s)
        }
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容