Kotlin 的單例,枚舉以及印章類

單例關鍵字:object
我們在定義一個類時,使用object 替換 class 來修飾這個類,就表示,這是一個單例類

單例類作爲代理人時,不需要()

1、場景說明
小頭爸爸爲了增進父子感情,想和小頭兒子一起洗碗

3、代碼實現
(1)、小頭爸爸重寫接口方法 —— 未使用單例時的錯誤寫法

class SmallHeadFather:IWashBow by BigHeadSon(){    

    override fun washBow() {
        println("我是小頭爸爸,我把洗碗事件委託給了大頭兒子")
        BigHeadSon().washBow()  //委託方重寫了事件之後,需要手動調用代理方的方法。但是,此處又通過()構建了一個小頭兒子對象,已經不再是我們初始委託的那個大頭兒子了。所以,此處是有問題的。
        println("我是小頭爸爸,大頭兒子洗完碗之後,我賺了9元")
    }
}

(2)、使用單例後的正確寫法:
大頭兒子單例類

object BigHeadSon:IWashBow {    //單例關鍵字object,聲明爲單例類之後會立即在內存中創建單例對象,並一直存在
    override fun washBow() {
        println("我是大頭兒子,每次洗碗賺1元錢")
    }
}

小頭爸爸委託事件給單例的大頭兒子

class SmallHeadFather:IWashBow by BigHeadSon{     //被委託方(即代理方)是單例類,不需要通過()構建對象

    override fun washBow() {
        println("我是小頭爸爸,雖然我把洗碗事件委託給了小頭兒子,但是我要和他一起洗碗")
        BigHeadSon.washBow()  //委託方重寫了事件之後,需要手動調用代理方的方法。由於 BigHeadSon是單例的,所以,這還是我們之前委託的那個兒子
        println("我是小頭爸爸,我和小頭兒子洗完碗之後,我賺了9元")
    }
}

(3)、外部調用

fun main(args: Array<String>) {
    var father=SmallHeadFather()
    father.washBow()    //小頭爸爸已經將洗碗的操作委託爲小頭兒子了,但因爲重寫了洗完事件,所以,本子是調用的父親的洗完事件,父親的洗完事件中有一部分是自己做的,另一部分是兒子做的
}

(4)、輸出結果

枚舉–enum
枚舉示例代碼

enum class Week {   //枚舉關鍵字 enum 
    星期一, 星期二, 星期三, 星期四, 星期五, 星期六, 星期天
}

fun main(args: Array<String>) {
    println(Week.星期一)
    println("${Week.星期一}在Week中的索引是${Week.星期一.ordinal}")
}

運行結果

印章類/密封類 (Sealed Class)
1、印章類的特點

子類類型有限的類成爲 印章類/密封類
印章類使用 sealed 作爲修飾符
印章類本身沒有構造方法

2、印章類與枚舉的區別

都是有限的數據
枚舉更注重具體的數據
印章類更注重數據的類型

3、印章類示例代碼
(1)、場景說明
假設你家有一頭公驢、一頭母驢、一頭公馬。那麼,
它們可能會生出一頭小驢,
也可能會生出一頭小騾子。

(2)、代碼示例
在上述場景中,由於他們能生出的兒子類型時固定的,所以,我們可以使用印章類來標識。
聲明印章類

sealed class Son {  //使用 sealed 聲明 Son 爲印章類/密封類

    class SmallMule() : Son()   //聲明小騾子 SmallMule 爲 Son的子類。
    class SmallDonkey() : Son() //聲明小驢子 SmallDonkey 爲 Son的子類

    fun sayHello(son: Son) {
        if (son is SmallMule) {     //判斷是不是XX的實例的關鍵字 is 
            println("小騾子對大家說大家好")
        } else if (son is SmallDonkey) {
            println("小驢子對大家說大家好")
        }
    }
}

調用印章類

fun main(args: Array<String>) {
    var mule = Son.SmallMule()
    var donkey = Son.SmallDonkey()

    var list = listOf<Son>(mule, donkey)
    for (son in list) {
        son.sayHello(son)
    }
}

運行結果

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章