日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

Kotlin的擴展(Extension)特性,你了解了嗎?

來源: 責編: 時間:2024-03-20 08:49:59 311觀看
導(dǎo)讀Kotlin擴展(Extension)特性允許為現(xiàn)有的類添加新的函數(shù)和屬性,而無需繼承該類或使用裝飾器模式。可以在不修改原始類的情況下,為它添加新的行為。在實際編程當中是非常有用的功能,具體場景如:我們想修改JDK中的String,想在它

Kotlin擴展(Extension)特性允許為現(xiàn)有的類添加新的函數(shù)和屬性,而無需繼承該類或使用裝飾器模式。可以在不修改原始類的情況下,為它添加新的行為。mSr28資訊網(wǎng)——每日最新資訊28at.com

在實際編程當中是非常有用的功能,具體場景如:我們想修改JDK中的String,想在它的基礎(chǔ)上增加一個方法"lastElement() "來獲取末尾元素,如果使用Java,我們是無法通過常規(guī)手段實現(xiàn)的,因為我們無法修改JDK的源碼。mSr28資訊網(wǎng)——每日最新資訊28at.com

擴展函數(shù)

fun ClassName.functionName(parameters) {    // 函數(shù)體}

ClassName是要添加函數(shù)的類名,functionName是新函數(shù)的名稱,parameters是函數(shù)的參數(shù)列表,函數(shù)體是函數(shù)的實際實現(xiàn)。mSr28資訊網(wǎng)——每日最新資訊28at.com

例如,我們可以向String類添加一個名為lastElement的擴展函數(shù),用于來獲取末尾元素:mSr28資訊網(wǎng)——每日最新資訊28at.com

fun String.lastElement(): Char? {    if (this.isEmpty()) {        return null    }    return this[length - 1]}// 使用擴展函數(shù)fun main() {    val msg = "Hello Wolrd"    // lastElement就像String的成員方法一樣可以直接調(diào)用    val last = msg.lastElement() // last = d}

lastElement函數(shù)就會在所有String對象上可用,而不需要修改String類的源代碼。mSr28資訊網(wǎng)——每日最新資訊28at.com

擴展函數(shù)實現(xiàn)原理,反編譯示例代碼:mSr28資訊網(wǎng)——每日最新資訊28at.com

public final class ExtKt {   public static final Character lastElement(String $this) {      CharSequence var1 = (CharSequence)$this;      if (var1.length() == 0) {        return null      }      return  var1.charAt(var1.length() - 1);   }}public static final void main() {  String msg = "Hello Wolrd";  Character last = ExtKt.lastElement(msg);}

原本定義在String類型上面的擴展函數(shù)lastElement(),變成了一個普通的靜態(tài)方法。另外,之前定義的擴展函數(shù)lastElement()是沒有參數(shù)的,但反編譯后的Java代碼中,lastElement(String $this)多了一個String類型的參數(shù)。原本msg.lastElement()的地方變成了ExtKt.lastElement(msg),這說明,Kotlin編寫的擴展函數(shù)調(diào)用代碼,最終會變成靜態(tài)方法的調(diào)用。mSr28資訊網(wǎng)——每日最新資訊28at.com

擴展屬性

Kotlin中的擴展屬性允許我們向現(xiàn)有的類添加新的屬性,而無需繼承該類或使用裝飾者模式。擴展屬性的語法與擴展函數(shù)類似,但是在屬性名之前需要指定接收者類型。mSr28資訊網(wǎng)——每日最新資訊28at.com

還是以lastElement為例,以擴展屬性的方式實現(xiàn):mSr28資訊網(wǎng)——每日最新資訊28at.com

// 接收者類型val String.lastElement: Char?    get() = if (isEmpty()) {            null        } else {            get(length - 1)        }fun main() {    val msg = "Hello Wolrd"    // lastElement就像String的成員屬性一樣可以直接調(diào)用    val last = msg.lastElement // last = d}

需要注意的是,擴展屬性并不會真正地向類中添加新的屬性,它只是提供了一種便捷的方式來訪問現(xiàn)有類的屬性或計算新的屬性值。不管是擴展函數(shù)還是擴展屬性,它本質(zhì)上都會變成一個靜態(tài)的方法。mSr28資訊網(wǎng)——每日最新資訊28at.com

應(yīng)用場景

Kotlin的擴展特性允許開發(fā)者向現(xiàn)有的類添加新的方法和屬性,而無需繼承該類或使用裝飾者模式。mSr28資訊網(wǎng)——每日最新資訊28at.com

  1. 擴展第三方庫:可以使用擴展函數(shù)為第三方庫中的類添加額外的功能,而無需修改原始類的源代碼。
  2. 使代碼更具可讀性:可以通過為常用的類添加自定義方法,使代碼更易讀、更易維護。
  3. 適配特定平臺:可以使用擴展函數(shù)為特定平臺(如Android或iOS)上的類添加平臺特定的功能,而無需在通用代碼中添加平臺相關(guān)的邏輯。
  4. 減少重復(fù)代碼:可以通過擴展函數(shù)將一些重復(fù)的操作封裝成新的方法,從而減少代碼重復(fù)性。

當然,擴展特性有一些使用限制:mSr28資訊網(wǎng)——每日最新資訊28at.com

  1. 擴展函數(shù)不能訪問私有或受保護的成員:擴展函數(shù)可以在類的外部定義,但不能訪問類的私有或受保護成員。
  2. 擴展函數(shù)不能被重寫:由于擴展函數(shù)是靜態(tài)解析的,因此不能被子類重寫。
  3. 不能在擴展函數(shù)中添加新的屬性:擴展函數(shù)可以為現(xiàn)有類添加新的函數(shù),但不能添加新的屬性。
  4. 不能在擴展函數(shù)中訪問super關(guān)鍵字:擴展函數(shù)中無法使用super關(guān)鍵字來調(diào)用基類的函數(shù)。
  5. 作用域限制:擴展函數(shù)的作用域是在導(dǎo)入它的包內(nèi),因此在其他包中無法直接使用。

Kotlin的擴展特性使用限制主要是為了保證代碼的可靠性和可維護性。mSr28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-77980-0.htmlKotlin的擴展(Extension)特性,你了解了嗎?

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: NEC 連續(xù) 13 年入選 Clarivate 全球創(chuàng)新者 100 強

下一篇: 20行代碼,封裝一個 React 圖片懶加載組件

標簽:
  • 熱門焦點
Top 主站蜘蛛池模板: 鄂托克前旗| 肃北| 平江县| 霍州市| 岫岩| 延吉市| 博乐市| 玉山县| 江北区| 林芝县| 屯留县| 朔州市| 阿克| 观塘区| 来凤县| 望江县| 成安县| 汉源县| 萝北县| 东光县| 商城县| 望江县| 奉节县| 金山区| 澄江县| 本溪市| 东方市| 博湖县| 芦溪县| 定日县| 承德县| 赤峰市| 扶沟县| 昌宁县| 黑水县| 台江县| 荥经县| 峡江县| 西丰县| 秀山| 盐源县|