Kotlin inline & infix

inline

內(nèi)聯(lián)函數(shù)

調(diào)用內(nèi)聯(lián)函數(shù)時,在編譯期間,被定義的內(nèi)聯(lián)函數(shù)體的代碼將被拷貝至每個調(diào)用方法體內(nèi)。

優(yōu)點:

取代默認的壓棧調(diào)用,消除壓棧、對象轉(zhuǎn)換產(chǎn)生的內(nèi)存分配、回調(diào)等開銷

缺點:

編譯后的代碼膨脹,消耗更多內(nèi)存空間

使用場景:

經(jīng)常調(diào)用的高階短函數(shù)

non-local control flow

內(nèi)聯(lián)函數(shù)中的內(nèi)聯(lián)lambda表達式中,return關(guān)鍵字將直接結(jié)束外部函數(shù)體,而非該lambda表達式或內(nèi)聯(lián)函數(shù),該行為被稱為非局部返回(non-local control flow)

noinline

在定義內(nèi)聯(lián)函數(shù)的參數(shù)列表中,指定不進行內(nèi)聯(lián)的 lambda 參數(shù)。

crossinline

在定義內(nèi)聯(lián)函數(shù)的參數(shù)列表中,指定內(nèi)聯(lián)但禁止return關(guān)鍵字(禁用non-local control flow功能)的lambda參數(shù),通常該參數(shù)會被傳遞至另一高階函數(shù)進行調(diào)用。

reified

具體化類型參數(shù)

在內(nèi)聯(lián)函數(shù)中,可以獲取泛型的真實類型。

這是因為在編譯期間,該泛型參數(shù)在代碼拷貝中被解析成實參類型,從而避免了類型擦除過程。

當(dāng)需要獲取泛型參數(shù)的真實類型時,使用reified進行聲明,此后可用于is、as、T::class等操作。

inline fun <reified T> List<*>.itemsAre(): Boolean =
        all { it is T }

contentList.itemsAre<Book>()

內(nèi)聯(lián)屬性

inline可用于標記getter、setter或整個計算屬性對象:

val foo: Foo
    inline get() = Foo()

var bar: Bar
    get() = ...
    inline set(v) { ... }

inline var bar: Bar
    get() = ...
    set(v) { ... }

坑:

內(nèi)聯(lián)函數(shù)體中不能直接訪問其外部類的成員,需要聲明所訪問成員為internal并使用注解@PublishedApi標記

infix

中綴符號,用于兩個對象間的運算

//定義中綴擴展方法
infix fun Int.do(x: Int): Int {...}
println(1 do 2)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容