inline
内联函数
调用内联函数时,在编译期间,被定义的内联函数体的代码将被拷贝至每个调用方法体内。
优点:
取代默认的压栈调用,消除压栈、对象转换产生的内存分配、回调等开销
缺点:
编译后的代码膨胀,消耗更多内存空间
使用场景:
经常调用的高阶短函数
non-local control flow
内联函数中的内联lambda表达式中,return关键字将直接结束外部函数体,而非该lambda表达式或内联函数,该行为被称为非局部返回(non-local control flow)
noinline
在定义内联函数的参数列表中,指定不进行内联的 lambda 参数。
crossinline
在定义内联函数的参数列表中,指定内联但禁止return关键字(禁用non-local control flow功能)的lambda参数,通常该参数会被传递至另一高阶函数进行调用。
reified
具体化类型参数
在内联函数中,可以获取泛型的真实类型。
这是因为在编译期间,该泛型参数在代码拷贝中被解析成实参类型,从而避免了类型擦除过程。
当需要获取泛型参数的真实类型时,使用reified进行声明,此后可用于is、as、T::class等操作。
inline fun <reified T> List<*>.itemsAre(): Boolean =
all { it is T }
contentList.itemsAre<Book>()
内联属性
inline可用于标记getter、setter或整个计算属性对象:
val foo: Foo
inline get() = Foo()
var bar: Bar
get() = ...
inline set(v) { ... }
inline var bar: Bar
get() = ...
set(v) { ... }
坑:
内联函数体中不能直接访问其外部类的成员,需要声明所访问成员为internal并使用注解@PublishedApi标记
infix
中缀符号,用于两个对象间的运算
//定义中缀扩展方法
infix fun Int.do(x: Int): Int {...}
println(1 do 2)





网友评论