将类传递给函数的 Kotlin 惯用方式

标签 kotlin

我有一个方法,它调用一个需要回调对象作为参数的对象方法。 回调对象必须定义 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/

相关文章:

spring - 作为查询参数传递给 spring restcontroller 的语言环境列表在测试时显示不规则行为

android - Unresolved reference 。由于接收器类型不匹配,以下候选者均不适用

android - Ktor:发送响应后删除临时文件

android - 我用于 Retrofit 接口(interface)创建的通用函数出现编译器错误 : inferred type is Class<T>?,但需要 Class<T!>

android - 我什么时候需要在 Gradle 依赖项中使用 Kapt?

kotlin - takeWhile 包含与谓词匹配的实际值 (takeWhileInclusive)

android - 如何使用 Paging3 库在 recyclerview 内的每个 n 位置添加分隔符?

intellij-idea - IntelliJ Idea更改粘贴的代码

kotlin - 如何在Ktor(Kotlin)中的管道的各个部分之间传递数据

intellij-idea - IntelliJ/Kotlin : What does the `^use` hint mean?