本文分2部分
1,inline
简单分析
2,inline
使用场景
一、inline
简单理解
个人理解:
- 使用
inline
关键字,编译时会将代码拷贝到调用的位置,以提高效率。
通过 内置的Let
函数,这个一个简单例子解释一下:
@kotlin.internal.InlineOnly
public inline fun <T, R> T.let(block: (T) -> R): R {
contract {
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
}
return block(this)
}
将高阶函数 let
的 inline
关键字删除,如下:
fun <T, R> T.let2(block: (T) -> R): R {
return block(this)
}
测试代码,仅打印出了日志:
class Test {
fun doTest() {
val name="zhangsan"
name.let {
Log.d("Kotlin- test : ", it)
}
val name2="zhangsan2"
name2.let2 {
Log.d("Kotlin- test2 : ", it)
}
}
}
//无 inline 关键字
fun <T, R> T.let2(block: (T) -> R): R {
return block(this)
}
通过 ide 反编译 kt 代码,查看区别:
上图可以看出,编译器将 name1
调用的代码,直接 copy
到了调用的地方,故可以简单理解为:使用 inline
会将代码 copy 到使用处。
附:Android studio 如何反编译 kt代码
二,上面简单介绍了一下 inline
继续分析一下inline
使用
思考:使用 inline
后,会将代码 拷贝 到调用处。如果方法特别长,拷贝这样过去,会不会使代码过于臃肿,给 JVM虚拟机造成负担。 如果是这样的话,那么 inline
是为了解决什么问题?
inline
出现,为了解决Lambda
带来的额外开销
通过一个测试代码简单描述一下:
1,未使用 inline
反编译出的结果为,testLambda
方法每次调用的时候,都 新建了一个实例:
2,使用inline
反编译出的结果为:
个人理解:实际开发中,如果在使用 Lambda 表达式 并且代码相对较短的时候,可以考虑使用
inline
,否则正常写即可。