Kotlin中的内联函数通过关键字inline进行定义,指示编译器将函数体直接插入到调用位置。这减少了调用函数的开销,特别是在使用lambda或短函数时,并消除了为捕获闭包而分配额外对象的需要。
示例:
def inline fun synchronized(lock: Any, block: () -> Unit) { kotlin.synchronized(lock) { block() } }
主要优点:
缺点:
**推荐:**在需要提高代码关键部分的性能时使用inline,特别是当使用lambda时。
在使用reified类型参数时,内联函数有什么限制?
常见错误回答: “实现的类型在任何内联函数内部始终可用。”
正确答案: 只有内联函数可以在泛型声明中使用reified修饰符,以允许在运行时访问类型:
inline fun <reified T> getTypeName() = T::class.java.name
在常规的泛型函数中,在执行期间将无法访问类型T。
故事
错误使用内联导致APK膨胀:在Android项目团队中,程序员将数十个实用函数标记为inline,包括具有复杂函数体的函数。结果——由于在所有调用位置重复函数,APK大小增长了近2MB。
故事
使用lambda和对私有变量的访问错误:使用了内联函数和lambda,在其中访问类的私有成员。将函数移动到外部模块后,代码无法编译(权限被破坏),这是在CI中才发现的。
故事
在非内联函数中使用reified:一位开发人员尝试在没有内联修饰符的情况下声明带有reified泛型参数的函数。代码无法编译,这导致新手花费了很长时间调查为什么“T::class”在内联函数之外不可用。