我有一个方法,它调用一个需要回调对象作为参数的对象方法。 回调对象必须定义 2 个方法:onEvent1() 和 onEvent2()。
一种方法是内联完成所有操作,但结果是它是 super 嵌套的并且变得不可读
myObj.method1(object : baseType {
override fun onEvent1() {
10 lines of nested code
}
override fun onEvent2() {
more nested code
}
)
鉴于一个方法超过 10 行,我发现它非常难以阅读。
在 Kotlin 中执行此操作的最佳方法是什么?
我知道的唯一非 kotlin 惯用方法是声明一个类并传递它的一个对象,也许是内部类。
void mymethod() {
class Obj : baseType {
override fun onEvent1() {....}
override fun onEvent2() {....}
}
val obj : Obj
myObj.method1(obj)
}
有更好的方法吗?
最佳答案
如果您为两个回调使用两个 lambda 表达式会怎样? lambda 的类型将是回调函数的类型:在您的示例 () -> Unit
中,对于不带参数并返回 Unit
结果的函数。首先,我们创建一个新方法,它接受两个回调并将它们包装到一个对象中:
fun myMethod(callback1: () -> Unit, callback2: () -> Unit) {
myObj.method1(object : baseType {
override fun onEvent1() { callback1() }
override fun onEvent2() { callback2() }
})
}
然后我们可以像这样调用新方法:
myMethod(
callback1 = { ... },
callback2 = { ... }
)
这比每次声明一个新对象要简洁一些。另一个好处是我们可以在将回调传递给函数之前单独定义它们:
val callback1 = { ... }
val callback2 = { ... }
myMethod(callback1, callback2)
关于将类传递给函数的 Kotlin 惯用方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68609715/