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)