Kotlin 對(duì)象聲明和表達(dá)式

在本文中,您將在示例的幫助下了解對(duì)象聲明(單例)和對(duì)象表達(dá)式。

對(duì)象聲明

單例是一種面向?qū)ο蟮哪J?,其中一個(gè)類只能有一個(gè)實(shí)例(對(duì)象)。
例如,您正在開發(fā)一個(gè)具有SQL數(shù)據(jù)庫(kù)后端的應(yīng)用程序。 您想創(chuàng)建一個(gè)連接池來(lái)訪問(wèn)數(shù)據(jù)庫(kù),同時(shí)為所有客戶端重用相同的連接。 為此,您可以通過(guò)單例類創(chuàng)建連接,以便每個(gè)客戶端獲得相同的連接。

Kotlin提供了一種使用對(duì)象聲明特性創(chuàng)建單例的簡(jiǎn)單方法。為此,使用 object 關(guān)鍵字。

object SingletonExample {
    ... .. ...
    //類主體
    ... .. ...
}

上面的代碼結(jié)合了一個(gè)類聲明和該類的單個(gè)實(shí)例 SingletonExample 的聲明

對(duì)象聲明可以包含屬性、方法等。 但是,它們不允許有構(gòu)造函數(shù)(這是有道理的)。

與普通類的對(duì)象相似,您可以使用 . 符號(hào)來(lái)調(diào)用方法和訪問(wèn)屬性。

示例:對(duì)象聲明

object Test {
    private var a: Int = 0
    var b: Int = 1

    fun makeMe12(): Int {
        a = 12
        return a
    }
}

fun main(args: Array<String>) {
    val result: Int

    result = Test.makeMe12()

    println("b = ${Test.b}")
    println("result = $result")
}

運(yùn)行該程序時(shí),輸出為:

b = 1
result = 12

對(duì)象聲明可以像普通類一樣從類和接口繼承。

單例 和 依賴注入

對(duì)象聲明有時(shí)會(huì)很有用。但是,它們?cè)谂c系統(tǒng)許多其他部分交互的大型軟件系統(tǒng)中并不理想。

Kotlin 對(duì)象表達(dá)式

object關(guān)鍵字還可用于創(chuàng)建匿名類的對(duì)象,稱為匿名對(duì)象。如果需要?jiǎng)?chuàng)建對(duì)某個(gè)類或接口稍加修改的對(duì)象,而不必為其聲明子類,則可以使用它們。例如,

window.addMouseListener(object : MouseAdapter() {
    override fun mouseClicked(e: MouseEvent) {
        // ...
    }

    override fun mouseEntered(e: MouseEvent) {
        // ...
    }
})

在這里,聲明了一個(gè)擴(kuò)展MouseAdapter類的匿名對(duì)象。該程序重寫了兩個(gè)MouseAdapter方法:mouseClicked()和mouseEntered()。

如有必要,可以為匿名對(duì)象分配名稱,并將其存儲(chǔ)在變量中。 例如:

val obj = object : MouseAdapter() {
    override fun mouseClicked(e: MouseEvent) {
        // ...
    }

    override fun mouseEntered(e: MouseEvent) {
        // ...
    }
}

示例:Kotlin 對(duì)象表達(dá)式

open class Person() {
    fun eat() = println("吃東西。")
    fun talk() = println("與人交談。")
    open fun pray() = println("向上帝祈禱。")
}

fun main(args: Array<String>) {
    val atheist = object : Person() {
        override fun pray() = println("我不祈禱。 我是一個(gè)無(wú)神論者。")
    }

    atheist.eat()
    atheist.talk()
    atheist.pray()
}

運(yùn)行該程序時(shí),輸出為:

吃東西。
與人交談。
我不祈禱。 我是一個(gè)無(wú)神論者。

這里,匿名對(duì)象存儲(chǔ)在變量atheist中,該變量實(shí)現(xiàn)Person類,pray()方法被重寫。

如果實(shí)現(xiàn)的類具有聲明匿名對(duì)象的構(gòu)造函數(shù),則需要傳遞適當(dāng)?shù)臉?gòu)造函數(shù)參數(shù)。例如,

open class Person(name: String, age: Int) {

    init {
        println("name: $name, age: $age")
    }

    fun eat() = println("吃東西。")
    fun talk() = println("與人交談。")
    open fun pray() = println("向上帝祈禱。")
}

fun main(args: Array<String>) {
    val atheist = object : Person("Jack", 29) {
        override fun pray() = println("我不祈禱。 我是一個(gè)無(wú)神論者。")
    }

    atheist.eat()
    atheist.talk()
    atheist.pray()
}

運(yùn)行該程序時(shí),輸出為:

name: Jack, age: 29
吃東西。
與人交談。
我不祈禱。 我是一個(gè)無(wú)神論者。
丰满人妻一级特黄a大片,午夜无码免费福利一级,欧美亚洲精品在线,国产婷婷成人久久Av免费高清