inline它是Kotlin中的一个关键字,用来修饰函数function,此时这个函数可以就被称为内联函数
当你调用一个内联函数的时候,编译器不会产生一次函数调用,不会有压栈出栈。而是会在每次调用时,将inline function中的代码直接复制到调用处。
在Kotlin中如何去声明一个inline function呢?
![](https://img.haomeiwen.com/i4471798/d10457fdd309e6fa.png)
直接在普通函数前加一个inline关键字修饰,就可以将一个普通的函数变成一个内联函数。
现在我们来看看原理:
![](https://img.haomeiwen.com/i4471798/0cd2f05e732c61ab.png)
![](https://img.haomeiwen.com/i4471798/015683cca34c26ff.png)
![](https://img.haomeiwen.com/i4471798/fb68cf96d23e7aba.png)
我们可以查看字节码进行对比,会发现sayHello代码直接出现在getInline方法中,没有存在Method invocation和public final sayHello(Ljava/lang/String;)V这种。
当我们把鼠标放在inline关键字这,会发现有个提示,意思就是这个函数目前声明inline是没有意义的,需要和接收函数类型(lambda)的fun一起使用。
![](https://img.haomeiwen.com/i4471798/b1ff41b31062707a.png)
我们再写个简单示例:在getInline方法中调用method方法 method参数是一个函数类型也就是lambda表达式。
![](https://img.haomeiwen.com/i4471798/2c14b39167ac5a5b.png)
我们查看字节码会在getInline方法中创建了一个匿名内部类的对象,也就说只是语法和写代码时简便了,本质上没变。
![](https://img.haomeiwen.com/i4471798/3000b21f7c0c955c.png)
没有生成这个匿名内部类对象了,直接把method is called字符串嵌入到调用处也就是getInline这,我们可以由此知道编译器怎么编译的inline函数的了。inline通常需要和接收函数类型参数的function配合使用。
使用inline函数的几个注意点:
1 不能在public(默认)方法中访问私有的成员
![](https://img.haomeiwen.com/i4471798/5b5702ddc56bebd3.png)
私有的方法可以访问私有的成员变量
![](https://img.haomeiwen.com/i4471798/969fdd1734fbf77b.png)
2 有return 语句时需要注意:
![](https://img.haomeiwen.com/i4471798/39d37df7cd80b5a0.png)
当调用main()方法时,如果直接写return那么后面的Log.d("tanyonglin","end execution")就不会执行,
当返回return@sayHello时候以return@label标签形式,只是结束内部函数。这个很好理解。
网友评论