Kotlin擴充套件函式


Kotlin擴充套件函式提供了一種向類「新增」方法而不繼承類或使用任何型別的設計模式的工具。 建立的擴充套件函式用作類中的常規函式。

擴充套件函式使用帶有方法名稱的字首接收器型別宣告。

fun <class_name>.<method_name>()

在上面的宣告中,<class_name>是接收器型別,<method_name>()是擴充套件函式。

擴充套件函式宣告及用法範例

通常,從類外部呼叫已經在類中定義的所有方法。在下面的範例中,Student類宣告一個方法是Passed(),它通過建立Student類的student物件,並在main()函式呼叫。

假設想呼叫一個沒有在Student類中定義的方法(比如isExcellent())。 在這種情況下,在Student類之外建立一個函式(isExcellent())為Student.isExcellent(),並從main()函式呼叫它。 宣告Student.isExcellent()函式稱為擴充套件函式,其中Student類稱為接收器型別。

class Student{
    fun isPassed(mark: Int): Boolean{
        return mark>40
    }
}
fun Student.isExcellent(mark: Int): Boolean{
    return mark > 90
}
fun main(args: Array<String>){
    val student = Student()
    val passingStatus = student.isPassed(55)
    println("學生通過狀態是: $passingStatus")

    val excellentStatus = student.isExcellent(95)
    println("學生優秀的狀態是:$excellentStatus")
}

執行上面範例程式碼,得到以下結果 -

學生通過狀態是: true
學生優秀的狀態是:true

以上範例僅演示了如何宣告擴充套件函式。

Kotlin擴充套件函式範例

下面來看看另一個擴充套件函式的範例。 在這個例子中,我們使用swap()方法交換MutableList <>的元素。 但是,MutableList <>類在內部不提供swap()方法來交換元素。 為此為MutableList <>建立swap()擴充套件函式。

列表物件使用list.swap(0,2)函式呼叫擴充套件函式(MutableList <Int> .swap(index1:Int,index2:Int):MutableList <Int>).swap(0,2)swap(0,2)函式傳遞MutableList <Int> .swap(index1:Int,index2:Int):MutableList <Int>)擴充套件函式中列表的索引值。

fun MutableList<Int>.swap(index1: Int, index2: Int):MutableList<Int> {
    val tmp = this[index1] // 'this' represents to the list
    this[index1] = this[index2]
    this[index2] = tmp
    return this
}
fun main(args: Array<String>) {
    val list = mutableListOf(5,10,15)
    println("在交換列表之前 :$list")
    val result = list.swap(0, 2)
    println("在交換列表之後 :$result")
}

執行上面範例程式碼,得到以下結果 -

在交換列表之前 :[5, 10, 15]
在交換列表之後 :[15, 10, 5]

擴充套件函式作為可空接收器

擴充套件函式可以定義為可空接收器型別。 即使物件值為null,也可以通過物件變數呼叫此可空擴充套件函式。 在函式主體內使用this == null檢查物件的可為空性。

下面是使用擴充套件函式作為可空接收器重寫上面範例中的程式。

fun MutableList<Int>?.swap(index1: Int, index2: Int): Any {
    if (this == null) return "null"
    else  {
        val tmp = this[index1] // 'this' represents to the list
        this[index1] = this[index2]
        this[index2] = tmp
        return this
    }
}
fun main(args: Array<String>) {
    val list = mutableListOf(5,10,15)
    println("在交換列表之前 :$list")
    val result = list.swap(0, 2)
    println("在交換列表之後 :$result")
}

執行上面範例程式碼,得到以下結果 -

在交換列表之前 :[5, 10, 15]
在交換列表之後 :[15, 10, 5]

Companion物件擴充套件

companion物件是在類中宣告並使用companion關鍵字標記的物件。 Companion物件用於直接使用類名稱呼叫類的成員函式(如java中的static關鍵字)。

包含companion物件的類也可以定義為companion物件的擴充套件函式和屬性。

Companion物件的範例

在這個例子中,使用類名(MyClass)作為限定符來呼叫在companion物件內宣告的create()函式。

class MyClass {
    companion object {
        fun create():String{
            return "呼叫建立 companion 物件的方法"
        }
    }
}
fun main(args: Array<String>){
    val instance = MyClass.create()
    println(instance)
}

執行上面範例程式碼,得到以下結果 -

呼叫建立 companion 物件的方法

Companion物件擴充套件範例
下面來看看一個Companion物件擴充套件的例子。 使用類名作為限定符來呼叫Companion物件擴充套件。

class MyClass {
    companion object {
        fun create(): String {
            return "呼叫 companion 物件的create方法"
        }
    }
}
fun MyClass.Companion.helloWorld() {
    println("執行 companion 物件的擴充套件")
}
fun main(args: Array<String>) {
    MyClass.helloWorld() // 在 companion 物件上宣告的擴充套件函式
}

執行上面範例程式碼,得到以下結果 -

執行 companion 物件的擴充套件