Kotlin Extension Function擴展函數(shù)詳細介紹
Kotlin 語言支持使用新功能擴展類的能力,而無需通過類實現(xiàn)繼承概念或使用設(shè)計模式,如裝飾器(Decorator)。 這是通過稱為擴展功能(Extension Function)的特殊方式來完成的。 因此,此功能可以有效地使代碼變得更清晰和易于閱讀,并且還可以減少代碼。 這里,我們介紹擴展函數(shù)(Extension Function)的概念及其使用方式,我們旨在將 Kotlin 中的擴展函數(shù)視為遵循 Android 開發(fā)中一些最佳實踐的能力。
1 什么是擴展函數(shù)(Extension Function)
從根本上說,擴展函數(shù)是類的成員函數(shù),但是定義在類之外。
例如,如果我們需要對 String 類使用一個方法,該方法返回一個刪除了第一個和最后一個字符的新字符串,我們可以為它編寫一個擴展方法。
2 為什么使用擴展函數(shù)(Extension Function)
一般來說,擴展函數(shù)有可能通過改進和刪除項目中的樣板代碼來使我們的代碼更簡潔、可讀和合乎邏輯。 此外,更少的代碼意味著更少的出錯機會。 除此之外
- 它可以向最終類添加功能。
- 它可以在不進行子類化(sub-classing)的情況下添加功能,這意味著我們可以在基類中提及對象引用及其實現(xiàn)。
- 它遵循面向?qū)ο缶幊讨械囊恍┳罴褜嵺`,特別是開放-封閉原則(在 SOLID 原則中),它指示實體(類、模塊、函數(shù)等)應(yīng)該對擴展開放,但對修改關(guān)閉。
3 如何使用擴展函數(shù)(Extension Function)
基本上,Kotlin 擴展函數(shù)提供了一種向類添加方法的工具,而無需繼承類或使用任何類型的設(shè)計模式。 創(chuàng)建的擴展函數(shù)用作該類中的常規(guī)函數(shù)。 擴展函數(shù)使用前綴接收器類型(類名)和方法名(擴展函數(shù))聲明,如下所示:
fun <class_name>.<method_name>()
通常,我們從類外部調(diào)用已在類內(nèi)部定義的所有方法。 例如,假設(shè)我們要調(diào)用 Circle 類的方法 perimeter() ,該方法未在類中定義。 那么這個時候,Circle.perimeter() 函數(shù)稱為擴展函數(shù)(Extension Function),Circle 類也稱為接收器類型(receiver type)。
class Circle(val radius: Double){
fun area(): Double{
return Math.PI * radius * radius;
}
}
fun Circle.perimeter(): Double{
return 2 * Math.PI * radius;
}
fun main(){
val circle = Circle(5.5);
val perimeterValue = circle.perimeter()
println("Perimeter: $perimeterValue")
val areaValue = circle.area()
println("Area: $areaValue")
}
4 擴展庫類
在 Kotlin 中,您可以擴展庫類以及用戶定義的類。 事實上,擴展函數(shù)可以添加到庫類中,并以與用戶定義類相同的方式使用。 例如:
fun main(args: Array<String>){
fun Int.abs() : Int{
return if(this < 0)
}
println((-4).abs())
println(4.abs())
}
5 空值接收器(Nullable Receiver)
擴展函數(shù)(Extension Function)可以用可以為空的類(nullable class)類型來定義。 在這種情況下,在擴展函數(shù)內(nèi)部添加了對 null 的檢查,并返回適當(dāng)?shù)闹怠?例如,我們使用 swap() 方法交換 Mutable List 的元素,但 MutableList 類內(nèi)部不支持 swap()。 因此,為了解決這個問題,我們應(yīng)該通過 swap() 函數(shù)為 MutableList 編寫一個擴展函數(shù)。
funMutableList<Int>?.swap(first: Int, second: Int): Any{
if (this == null) return "null" //Checked the null-ability here!
else{
val temp = this[first]
this[first] = this[second]
this[second] = temp
return this
}
}
fun main(){
val list = mutableListOf(6,9,7)
println("Print the list :$list")
val result = list.swap(0, 2)
println("swapping the list :$result") //Output: [7, 10, 6]
}
6 伴隨對象擴展(Companion Object Extensions)
事實上,伴生對象(companion object)是在類中提及并使用伴生關(guān)鍵字指定的對象。 伴生對象用于直接調(diào)用類的成員函數(shù),使用類名,類似于 Java 中的 static 關(guān)鍵字。如果一個類包含伴生對象,我們可以為伴生對象定義擴展函數(shù)和屬性。
class SampleClass {
companion object { }
}
fun SampleClass.Companion.printTest() { println("Test") }
fun main() {
SampleClass.printTest()
}
此外,可以使用類名(限定符)調(diào)用伴隨對象擴展。 例如:
class SampleClass{
companion object{
fun create(sample :String): String{
return sample
}
}
}
fun SampleClass.Companion.printString(){
println("Companion Object Extensions")
}
fun main(args: Array<String>){
val sampleObject = SampleClass.printString("Print the string")
println(sampleObject)
}
所以說,Kotlin 支持使用新功能擴展類的能力,而無需實現(xiàn)繼承或使用設(shè)計模式設(shè)計模式。 這是通過稱為擴展功能的特殊指示來完成的。 這種能力可能有助于使代碼變得更清晰和易于閱讀,并且還可以減少代碼。 然而,這種方法有一些負(fù)面后果。 例如,我們不能訪問基類的受保護屬性或函數(shù)。
到此這篇關(guān)于Kotlin Extension Function擴展函數(shù)詳細介紹的文章就介紹到這了,更多相關(guān)Kotlin Extension Function 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android動畫效果之自定義ViewGroup添加布局動畫(五)
這篇文章主要介紹了Android動畫效果之自定義ViewGroup添加布局動畫,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-08-08
android自定義gradle插件并且發(fā)布到本地倉庫詳細教程
這篇文章主要介紹了android自定義gradle插件并且發(fā)布到本地倉庫詳細教程的相關(guān)資料,需要的朋友可以參考下2023-07-07
Android編程實現(xiàn)動態(tài)支持多語言的方法
這篇文章主要介紹了Android編程實現(xiàn)動態(tài)支持多語言的方法,涉及Android資源、控件及屬性相關(guān)操作技巧,需要的朋友可以參考下2017-06-06
android開發(fā)實現(xiàn)列表控件滾動位置精確保存和恢復(fù)的方法(推薦)
下面小編就為大家?guī)硪黄猘ndroid開發(fā)實現(xiàn)列表控件滾動位置精確保存和恢復(fù)的方法(推薦)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-03-03
Android TextView自定義數(shù)字滾動動畫
這篇文章主要為大家詳細介紹了Android TextView自定義數(shù)字滾動動畫,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-04-04

