kotlin 定义接口回调的一些疑问
来源:6-2 内联函数

默小铭
2023-05-15
场景: 在kotlin代码实现 Java方式的接口回调,每次都得重写一个object,如
ConfirmDialog.newInstance()
.setTitle("disconnect")
.setMessage("Confirm disconnection?")
.setOnConfirmClickListener(object : DialogInterface.OnClickListener {
override fun onClick(dialog: BaseDialog) {
mSolosDeviceManager.disconnect(matchAddress)
HomeHelper.instance.startHomActivity(this@FishGlassSettingActivity)
dialog.dismiss()
}
})
.show(supportFragmentManager)
但是java 的setOnClickListener方法因为lambda语法糖,又可以节省object,然后想着网上搜kotlin定义接口回调的方式是这样的
private lateinit var mListener: () -> Unit
fun setOnClickListener(listener: () -> Unit) {
this.mListener = listener
}
虽然能实现,但听课后,有个纠结的点,课上老师说高阶函数内部会new一个Function,如果要优化,可以用inline修饰,如果如上定义接口回到,用inline修饰,提示inline无法修饰public函数
想请问下老师kotlin定义接口回调网上这种写法有没问题,有没更优解,然后不用inline修饰性能影响大吗?
写回答
2回答
-
性能上,Java其实也不会节省对象,一般都会有对象构造出来。所以你的问题其实是用Kotlin写如何也能用lambda吧,定义参数类型的时候使用函数类型,或者Kotlin的fun interface类型或者Java定义的单一方法接口,都是可以的。012023-05-16
-
bennyhuo
2023-05-15
DialogInterface.OnClickListener 是Java单一方法接口,应该是支持sam的,Kotlin当中可以用lambda表达式简化的00
相似问题