前兩天介紹了類別的用法,文章中也多次提及了 “物件” (Object) 這個用法,這時的你應該懷疑,這個 ”物件” 跟 Kotlin 相關的物件導向語言有什麼關聯嗎?今天就讓我們談談 “物件” 本身。
前兩天說的類別裡面包含了 “屬性” 與 “函式” (或常被稱為 ”方法” (Method)),但不曾想過,這些定義 (類別) 看起來就是被呼叫就可以不斷對內部的屬性或是函式進行再次訪問 (呼叫),然後根據不同的傳入值似乎也可以生成不同的結果。
沒錯,有這樣的想法的你是對的,其實第一次被呼叫,或昨天所說的建構子就是用來生成一個物件的。這裡每一個物件在沒有建立連結之前,理論上會是獨立且互不相干的,並不會因為世界上有兩位叫做 Jack Wu
的人就會導致 Person()
無法生成物件,但這裡你就會需要兩個變數記住兩個 Jack Wu
。下方範例可以幫助理解:
class Person(val name: String) {
// 忽略中間的內容
}
fun main() {
// 建立兩個 Jack Wu
val jackWu1 = Person("Jack Wu")
val jackWu2 = Person("Jack Wu")
// Printing the names of the two instances
println("First Jack Wu: ${jackWu1.name}")
println("Second Jack Wu: ${jackWu2.name}")
// Modifying one instance does not affect the other
jackWu1.name = "Jack Wu Modified"
// Printing the names again to demonstrate independence
println("First Jack Wu after modification: ${jackWu1.name}")
println("Second Jack Wu after modification: ${jackWu2.name}")
}
結果:
First Jack Wu: Jack Wu
Second Jack Wu: Jack Wu
First Jack Wu after modification: Jack Wu Modified
Second Jack Wu after modification: Jack Wu
上面提到是物件透過類別作為藍圖被生成到程式中,在 Kotlin 中也用了 object
這個詞代表了另外一個物件導向語言的觀念 “單例” (Singleton)。其實想法跟物件很像,回想上面在介紹物件時,我們透過呼叫 Person()
的時候生成一個物件,這時候我們可以把這個物件視為這次程式運行中唯一的存在 (這裡我先埋一個坑,關於 String pool 這觀念會有這有點不同 XD ),所以如果我今天想要讓整段程式在運行中只有我這一份物件時,我就會使用單例這種設計模式 (design pattern ref.):
val anonymousObject = object {
val name = "匿名物件"
fun sayHello() {
println("來自$name")
}
}
anonymousObject.sayHello() // 輸出:來自匿名物件
object SingletonObject {
val name = "單例物件"
fun sayHello() {
println("來自$name")
}
}
SingletonObject.sayHello() // 輸出:來自單例物件
上述範例透過兩種不同方式建立單例,以下方的範例來說,我可以在整份程式碼的任何位置去存取這裡建立的 SingletonObject
且確保他是唯一的。