内联函数
1. 什么是内联函数
- 在普通函数前面加上inline,代码示例:
kotlin
// 在 main() 中调用 makeTest()
fun main() {
Log.i("zc_test", "main() start")
makeTest()
Log.i("zc_test", "main() end")
}
// 内联函数 makeTest()
private inline fun makeTest() {
Log.i("zc_test", "makeTest")
}
- 使用inline编译成的java代码
java
public final void main() {
Log.i("zc_test", "main() start");
int $i$f$makeTest = false;
Log.i("zc_test", "makeTest");
Log.i("zc_test", "main() end");
}
- 当 makeTest() 不在被 inline 修饰时, 被编辑成 java 的代码为:
java
public final void main() {
Log.i("zc_test", "main() start");
this.makeTest();
Log.i("zc_test", "main() end");
}
当 makeTest() 被inline 修饰时, 在 main() 中原来调用 makeTest() 的地方被替换成了 makeTest() 里面的代码。 也就是说在编译时期,把调用这个函数的地方用这个函数的方法体进行替换
DANGER
inline 不适合在无参数的函数中,适合在包含 lambda 参数的函数上。
例如:
kotlin
// body 是本身一个函数
fun foo(body:() -> Unit) {
println("foo() hahaha")
ordinaryFunction(body)
}
inline fun ordinaryFunction(block: () -> Unit) {
println("hahha")
block.invoke()
println("hahha233333")
}