Kotlin Extension Function擴展函數詳細介紹
Kotlin 語言支持使用新功能擴展類的能力,而無需通過類實現繼承概念或使用設計模式,如裝飾器(Decorator)。 這是通過稱為擴展功能(Extension Function)的特殊方式來完成的。 因此,此功能可以有效地使代碼變得更清晰和易于閱讀,并且還可以減少代碼。 這里,我們介紹擴展函數(Extension Function)的概念及其使用方式,我們旨在將 Kotlin 中的擴展函數視為遵循 Android 開發(fā)中一些最佳實踐的能力。
1 什么是擴展函數(Extension Function)
從根本上說,擴展函數是類的成員函數,但是定義在類之外。
例如,如果我們需要對 String 類使用一個方法,該方法返回一個刪除了第一個和最后一個字符的新字符串,我們可以為它編寫一個擴展方法。
2 為什么使用擴展函數(Extension Function)
一般來說,擴展函數有可能通過改進和刪除項目中的樣板代碼來使我們的代碼更簡潔、可讀和合乎邏輯。 此外,更少的代碼意味著更少的出錯機會。 除此之外
- 它可以向最終類添加功能。
- 它可以在不進行子類化(sub-classing)的情況下添加功能,這意味著我們可以在基類中提及對象引用及其實現。
- 它遵循面向對象編程中的一些最佳實踐,特別是開放-封閉原則(在 SOLID 原則中),它指示實體(類、模塊、函數等)應該對擴展開放,但對修改關閉。
3 如何使用擴展函數(Extension Function)
基本上,Kotlin 擴展函數提供了一種向類添加方法的工具,而無需繼承類或使用任何類型的設計模式。 創(chuàng)建的擴展函數用作該類中的常規(guī)函數。 擴展函數使用前綴接收器類型(類名)和方法名(擴展函數)聲明,如下所示:
fun <class_name>.<method_name>()
通常,我們從類外部調用已在類內部定義的所有方法。 例如,假設我們要調用 Circle 類的方法 perimeter() ,該方法未在類中定義。 那么這個時候,Circle.perimeter() 函數稱為擴展函數(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 中,您可以擴展庫類以及用戶定義的類。 事實上,擴展函數可以添加到庫類中,并以與用戶定義類相同的方式使用。 例如:
fun main(args: Array<String>){ fun Int.abs() : Int{ return if(this < 0) } println((-4).abs()) println(4.abs()) }
5 空值接收器(Nullable Receiver)
擴展函數(Extension Function)可以用可以為空的類(nullable class)類型來定義。 在這種情況下,在擴展函數內部添加了對 null 的檢查,并返回適當的值。 例如,我們使用 swap() 方法交換 Mutable List 的元素,但 MutableList 類內部不支持 swap()。 因此,為了解決這個問題,我們應該通過 swap() 函數為 MutableList 編寫一個擴展函數。
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)是在類中提及并使用伴生關鍵字指定的對象。 伴生對象用于直接調用類的成員函數,使用類名,類似于 Java 中的 static 關鍵字。如果一個類包含伴生對象,我們可以為伴生對象定義擴展函數和屬性。
class SampleClass { companion object { } } fun SampleClass.Companion.printTest() { println("Test") } fun main() { SampleClass.printTest() }
此外,可以使用類名(限定符)調用伴隨對象擴展。 例如:
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 支持使用新功能擴展類的能力,而無需實現繼承或使用設計模式設計模式。 這是通過稱為擴展功能的特殊指示來完成的。 這種能力可能有助于使代碼變得更清晰和易于閱讀,并且還可以減少代碼。 然而,這種方法有一些負面后果。 例如,我們不能訪問基類的受保護屬性或函數。
到此這篇關于Kotlin Extension Function擴展函數詳細介紹的文章就介紹到這了,更多相關Kotlin Extension Function 內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
android基本控件ToggleButton&Switch使用指南
本文給大家匯總介紹了android的2個基本控件ToggleButton和Switch的使用方法,非常的詳細,有需要的小伙伴可以參考下。2016-01-01Android RadarView雷達圖(蜘蛛網圖)的實現代碼
這篇文章主要介紹了Android RadarView雷達圖(蜘蛛網圖)的實現代碼,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-03-03