kotlin-inline函数
⾼阶函数是将函数⽤作参数或返回值的函数。如lambda表达式
1.⾼阶函数缺点: 使⽤⾼阶函数会带来⼀些运⾏时的效率损失:每⼀个函数都是⼀个对象,并且会捕获⼀个闭包。 即那些在函数体内会访问到的变量。 内存分配(对于函数对象和类)和虚拟调⽤会引⼊运⾏时间开销。
尤其在循环中,能节省很多开销。
于是,inline诞⽣:
lock(l) { foo() }
复制代码
注:上⾯的代码,编译器会⾃动转成,不会⽣成函数对象
l.lock()
try {
foo()
}
finally {
l.unlock()
}
复制代码
具体做法:
inline fun <T> lock(lock: Lock, body: () -> T): T { …… }
复制代码
2.优雅的参数类型写法
如:有时候我们需要访问⼀个作为参数传给我们的⼀个类型:
fun TreeNode.findParentOfType(clazz: Class): T? { var p = parent while (p != null && !clazz.isInstance(p)) { p = p.parent }
@Suppress("UNCHECKED_CAST") return p as T? } 在这⾥我们向上遍历⼀棵树并且检查每个节点是不是特定的类型。 这都没有问题,但是调⽤处不是很优雅:
treeNode.findParentOfType(MyTreeNode::class.java) 我们真正想要的只是传⼀个类型给该函数,即像这样调⽤它:
treeNode.findParentOfType() 为能够这么做,内联函数⽀持具体化的类型参数,于是我们可以这样写:
inline fun TreeNode.findParentOfType(): T? { var p = parent while (p != null && p !is T) { p = p.parent } return p as T? } 我们使⽤ reified 修饰符来限定类型参数,现在可以在函数内部访问它了, ⼏乎就像是⼀个普通的类⼀样。由于函数是内联的,不需要反射,正常的操作符如 !is 和 as 现在都能⽤了。此外,我们还可以按照上⾯提到的⽅式调⽤它:myTree.findParentOfType()。
3.内联属性
val foo: Fookotlin修饰符
inline get() = Foo()
var bar: Bar
get() = ……
inline set(v) { …… }
你也可以标注整个属性,将它的两个访问器都标记为内联:
inline var bar: Bar
get() = ……
set(v) { …… }
在调⽤处,内联访问器如同内联函数⼀样内联
复制代码
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论