網站首頁 編程語言 正文
Kotlin 語言支持使用新功能擴展類的能力,而無需通過類實現繼承概念或使用設計模式,如裝飾器(Decorator)。 這是通過稱為擴展功能(Extension Function)的特殊方式來完成的。 因此,此功能可以有效地使代碼變得更清晰和易于閱讀,并且還可以減少代碼。 這里,我們介紹擴展函數(Extension Function)的概念及其使用方式,我們旨在將 Kotlin 中的擴展函數視為遵循 Android 開發中一些最佳實踐的能力。
1 什么是擴展函數(Extension Function)
從根本上說,擴展函數是類的成員函數,但是定義在類之外。
例如,如果我們需要對 String 類使用一個方法,該方法返回一個刪除了第一個和最后一個字符的新字符串,我們可以為它編寫一個擴展方法。
2 為什么使用擴展函數(Extension Function)
一般來說,擴展函數有可能通過改進和刪除項目中的樣板代碼來使我們的代碼更簡潔、可讀和合乎邏輯。 此外,更少的代碼意味著更少的出錯機會。 除此之外
- 它可以向最終類添加功能。
- 它可以在不進行子類化(sub-classing)的情況下添加功能,這意味著我們可以在基類中提及對象引用及其實現。
- 它遵循面向對象編程中的一些最佳實踐,特別是開放-封閉原則(在 SOLID 原則中),它指示實體(類、模塊、函數等)應該對擴展開放,但對修改關閉。
3 如何使用擴展函數(Extension Function)
基本上,Kotlin 擴展函數提供了一種向類添加方法的工具,而無需繼承類或使用任何類型的設計模式。 創建的擴展函數用作該類中的常規函數。 擴展函數使用前綴接收器類型(類名)和方法名(擴展函數)聲明,如下所示:
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 支持使用新功能擴展類的能力,而無需實現繼承或使用設計模式設計模式。 這是通過稱為擴展功能的特殊指示來完成的。 這種能力可能有助于使代碼變得更清晰和易于閱讀,并且還可以減少代碼。 然而,這種方法有一些負面后果。 例如,我們不能訪問基類的受保護屬性或函數。
原文鏈接:https://blog.csdn.net/zyctimes/article/details/127814560
相關推薦
- 2022-08-13 深入理解Linux內核select多路復用原理
- 2022-07-13 Linux下網絡配置和ifconfig命令的使用
- 2022-05-10 setAttribute() 與 getAttribute() 用法剖析及選項卡操作的實例展示,這一
- 2022-04-28 Pytorch中torch.flatten()和torch.nn.Flatten()實例詳解_pyt
- 2022-04-09 SpringBoot 安全漏洞之SQL注入解決方案
- 2022-04-09 SpringBoot 提示:RequestRejectedException:The request
- 2022-09-20 go語言VScode?see?'go?help?modules'?(exit?status?1)問題
- 2022-10-01 python實現圖像增強算法_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支