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
以上範例僅演示了如何宣告擴充套件函式。
下面來看看另一個擴充套件函式的範例。 在這個例子中,我們使用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
物件用於直接使用類名稱呼叫類的成員函式(如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 物件的擴充套件