iT邦幫忙

2023 iThome 鐵人賽

DAY 17
0

前兩天介紹了類別的用法,文章中也多次提及了 “物件” (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 且確保他是唯一的。


上一篇
Day 16 Kotlin 中的類別 (2)
下一篇
Day 18 Kotlin 伴生物件
系列文
成為一名 Kotlin 後端攻城獅30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言