Kotlin中将回调类对象传入函数的惯用实现方案有哪些?
Kotlin 多方法回调的惯用优化方案
针对多回调方法的接口传参场景,Kotlin 有两种常用的优化方案,远比对半内部类的写法更简洁:
方案1:可修改原方法定义时,优先拆分函数参数
如果有权限调整 method1 的实现,可以直接把两个回调逻辑拆成独立的函数类型参数,从根源上避免匿名内部类的嵌套模板:
// 改造原方法定义,内部做一层轻量适配 fun method1( onEvent1: () -> Unit, onEvent2: () -> Unit ) { val callback = object : baseType { override fun onEvent1() = onEvent1() override fun onEvent2() = onEvent2() } // 原有调用 callback 的逻辑保持不变 }
调用时可以把复杂逻辑单独抽成变量/成员方法,完全没有嵌套负担:
fun mymethod() { // 逻辑复杂时单独声明,层级只有1层 val handleEvent1: () -> Unit = { // 10行+的业务逻辑直接写在这里 } val handleEvent2: () -> Unit = { // event2 对应的业务逻辑 } myObj.method1(handleEvent1, handleEvent2) }
如果逻辑需要多处复用,还可以直接传类的成员方法引用:
class MyClass { private fun handleEvent1() { /* 复用逻辑 */ } private fun handleEvent2() { /* 复用逻辑 */ } fun mymethod() { myObj.method1(::handleEvent1, ::handleEvent2) } }
方案2:无法修改原方法定义时,封装回调构造函数
如果原有 baseType 接口和 method1 实现不能改动,可以写一次工具函数封装匿名对象的创建,后续所有调用处都可以复用:
// 只需要写一次封装 fun BaseTypeCallback( onEvent1: () -> Unit, onEvent2: () -> Unit ) = object : baseType { override fun onEvent1() = onEvent1() override fun onEvent2() = onEvent2() }
调用时的体验和改造原方法完全一致,没有额外模板代码:
fun mymethod() { val handleEvent1: () -> Unit = { /* 逻辑 */ } val handleEvent2: () -> Unit = { /* 逻辑 */ } myObj.method1(BaseTypeCallback(handleEvent1, handleEvent2)) }
内容的提问来源于stack exchange,提问作者Denver123
相关产品推荐
相关产品推荐

