偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

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

開發(fā) 前端
擴(kuò)展屬性并不會(huì)真正地向類中添加新的屬性,它只是提供了一種便捷的方式來(lái)訪問現(xiàn)有類的屬性或計(jì)算新的屬性值。不管是擴(kuò)展函數(shù)還是擴(kuò)展屬性,它本質(zhì)上都會(huì)變成一個(gè)靜態(tài)的方法。

Kotlin擴(kuò)展(Extension)特性允許為現(xiàn)有的類添加新的函數(shù)和屬性,而無(wú)需繼承該類或使用裝飾器模式。可以在不修改原始類的情況下,為它添加新的行為。

在實(shí)際編程當(dāng)中是非常有用的功能,具體場(chǎng)景如:我們想修改JDK中的String,想在它的基礎(chǔ)上增加一個(gè)方法"lastElement() "來(lái)獲取末尾元素,如果使用Java,我們是無(wú)法通過常規(guī)手段實(shí)現(xiàn)的,因?yàn)槲覀儫o(wú)法修改JDK的源碼。

擴(kuò)展函數(shù)

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

ClassName是要添加函數(shù)的類名,functionName是新函數(shù)的名稱,parameters是函數(shù)的參數(shù)列表,函數(shù)體是函數(shù)的實(shí)際實(shí)現(xiàn)。

例如,我們可以向String類添加一個(gè)名為lastElement的擴(kuò)展函數(shù),用于來(lái)獲取末尾元素:

fun String.lastElement(): Char? {
    if (this.isEmpty()) {
        return null
    }
    return this[length - 1]
}

// 使用擴(kuò)展函數(shù)
fun main() {
    val msg = "Hello Wolrd"
    // lastElement就像String的成員方法一樣可以直接調(diào)用
    val last = msg.lastElement() // last = d
}

lastElement函數(shù)就會(huì)在所有String對(duì)象上可用,而不需要修改String類的源代碼。

擴(kuò)展函數(shù)實(shí)現(xiàn)原理,反編譯示例代碼:

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類型上面的擴(kuò)展函數(shù)lastElement(),變成了一個(gè)普通的靜態(tài)方法。另外,之前定義的擴(kuò)展函數(shù)lastElement()是沒有參數(shù)的,但反編譯后的Java代碼中,lastElement(String $this)多了一個(gè)String類型的參數(shù)。原本msg.lastElement()的地方變成了ExtKt.lastElement(msg),這說明,Kotlin編寫的擴(kuò)展函數(shù)調(diào)用代碼,最終會(huì)變成靜態(tài)方法的調(diào)用。

擴(kuò)展屬性

Kotlin中的擴(kuò)展屬性允許我們向現(xiàn)有的類添加新的屬性,而無(wú)需繼承該類或使用裝飾者模式。擴(kuò)展屬性的語(yǔ)法與擴(kuò)展函數(shù)類似,但是在屬性名之前需要指定接收者類型。

還是以lastElement為例,以擴(kuò)展屬性的方式實(shí)現(xiàn):

// 接收者類型
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
}

需要注意的是,擴(kuò)展屬性并不會(huì)真正地向類中添加新的屬性,它只是提供了一種便捷的方式來(lái)訪問現(xiàn)有類的屬性或計(jì)算新的屬性值。不管是擴(kuò)展函數(shù)還是擴(kuò)展屬性,它本質(zhì)上都會(huì)變成一個(gè)靜態(tài)的方法。

應(yīng)用場(chǎng)景

Kotlin的擴(kuò)展特性允許開發(fā)者向現(xiàn)有的類添加新的方法和屬性,而無(wú)需繼承該類或使用裝飾者模式。

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

當(dāng)然,擴(kuò)展特性有一些使用限制:

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

Kotlin的擴(kuò)展特性使用限制主要是為了保證代碼的可靠性和可維護(hù)性。

責(zé)任編輯:武曉燕 來(lái)源: 沐雨花飛蝶
相關(guān)推薦

2023-11-27 00:48:46

displayvisibility

2023-11-06 17:37:17

技術(shù)架構(gòu)任務(wù)隊(duì)列

2022-10-24 08:45:23

數(shù)據(jù)庫(kù)應(yīng)用場(chǎng)景區(qū)塊鏈

2023-05-09 09:00:20

版本Canary框架

2023-06-26 07:32:43

Kubernetes容器

2023-09-27 16:29:55

開發(fā)團(tuán)隊(duì)信息

2025-02-17 08:18:27

C#TypeScriptJavaScript

2024-01-03 08:08:51

Pulsar版本數(shù)據(jù)

2024-02-19 08:40:22

2023-12-14 12:55:41

Pythondel語(yǔ)句

2023-10-26 07:09:30

Golangrune字符

2023-10-12 16:39:00

2022-07-18 09:41:29

屬性類型安全Spring

2023-05-15 08:16:33

Google I/OWeb平臺(tái)

2010-08-29 21:09:57

DHCP協(xié)議

2023-09-27 07:35:27

2023-09-22 08:01:10

2024-03-15 08:23:26

異步編程函數(shù)

2019-12-26 09:15:44

網(wǎng)絡(luò)IOLinux

2014-02-17 10:54:13

PostgreSQL數(shù)據(jù)庫(kù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)