在本文中,您將在示例的幫助下了解對(duì)象聲明(單例)和對(duì)象表達(dá)式。
單例是一種面向?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)屬性。
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)中并不理想。
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) { // ... } }
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ú)神論者。