# Kotlin擴展函數和擴展屬性怎么聲明
## 一、擴展函數的概念與聲明
### 1.1 什么是擴展函數
擴展函數(Extension Functions)是Kotlin中一種特殊的函數,它允許在不修改原始類的情況下,為現有類添加新的方法。這種機制打破了傳統面向對象設計中類必須通過繼承或組合來擴展功能的限制。
### 1.2 基本語法
```kotlin
fun ReceiverType.functionName(parameters): ReturnType {
// 函數體
// 可以使用this訪問接收者對象
}
示例:為String類添加一個反轉字符串的擴展函數
fun String.reverse(): String {
return this.reversed() // this指代調用該函數的String對象
}
// 使用
val original = "Kotlin"
println(original.reverse()) // 輸出:niltoK
ReceiverType?
聲明可處理null情況fun String?.safeLength(): Int = this?.length ?: 0
與擴展函數類似,擴展屬性允許為現有類添加新的屬性(但實際不插入字段,必須通過getter/setter實現)
val ReceiverType.propertyName: PropertyType
get() = /* 返回表達式 */
var ReceiverType.mutableProperty: PropertyType
get() = /* 返回表達式 */
set(value) { /* 設置邏輯 */ }
val String.lastChar: Char
get() = this[length - 1]
var StringBuilder.lastChar: Char
get() = this[length - 1]
set(value) {
this.setCharAt(length - 1, value)
}
// 使用
println("Hello".lastChar) // o
val sb = StringBuilder("Kotlin?")
sb.lastChar = '!'
println(sb) // Kotlin!
val Int.double = this * 2
會報錯)import packagename.functionName
當擴展函數與成員函數簽名相同時: - 成員函數優先調用 - 可使用相同簽名不同返回類型的擴展(但應避免)
fun <T> List<T>.penultimate(): T {
if (size < 2) throw NoSuchElementException()
return this[size - 2]
}
// 使用
val list = listOf(1, 2, 3)
println(list.penultimate()) // 2
class MyClass {
companion object
}
fun MyClass.Companion.printHello() {
println("Hello from companion")
}
// 調用
MyClass.printHello()
替代Java中的靜態工具類:
// 代替StringUtils.isEmpty()
fun String.isNullOrBlank(): Boolean = this == null || isBlank()
fun table(init: TableBuilder.() -> Unit): Table {
val builder = TableBuilder()
builder.init()
return builder.build()
}
fun View.show() { this.visibility = View.VISIBLE }
fun View.hide() { this.visibility = View.GONE }
// 使用
myButton.show()
Java調用擴展:實際編譯為靜態方法
// Java中調用
StringExtKt.reverse("text");
文件注解:使用@file:JvmName
指定類名
@file:JvmName("StringUtils")
package com.example
特性 | 擴展函數 | 擴展屬性 |
---|---|---|
聲明方式 | fun Type.func() |
val Type.prop |
支持讀寫 | 不適用 | var聲明可變屬性 |
實現限制 | 無特殊限制 | 不能有幕后字段 |
典型用途 | 添加操作行為 | 添加計算屬性 |
最佳實踐建議: 1. 優先用于增強第三方庫 2. 避免過度使用導致代碼可讀性下降 3. 注意與成員函數的命名沖突 “`
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。