Kotlin - 用两个不同的单方法接口替换单个双方法接口
Kotlin - Replace a single two-methods interface with two different one-method interfaces
首先,我想澄清一下,我的问题是针对个人代码风格偏好。
假设我有一个方法,它接受一个接口作为参数,并且所述接口中有两个方法。
在 kotlin 中,匿名实现接口,我们会有类似的东西
client.execute(object : Callback() {
override fun onResponse(response: Response) {/*...*/}
override fun onError(error: Error) {/*...*/}
})
我想做的是为 client
对象创建一个扩展,该扩展将采用两个不同的接口,例如
interface ClientResponse{fun onResponse(response: Response)}
interface ClientError{fun onError(error: Error)}
然后新的 execute
方法看起来像
client.executeCustom(
{response -> /*...*/},
{error -> /*...*/}
})
真是一种 SAM 解决方案。
有可能吗?
这应该是一个相当简单的扩展,您可以立即获取两个 lambda 参数,然后在其中创建一个 Callback
实例来委托对这些 lambda 的调用:
fun Client.executeCustom(onResponse: (Response) -> Unit, onError: (Error) -> Unit) {
execute(object : Callback() {
override fun onResponse(response: Response) = onResponse(response)
override fun onError(error: Error) = onError(error)
})
}
这样,你甚至不需要引入新的接口。
首先,我想澄清一下,我的问题是针对个人代码风格偏好。
假设我有一个方法,它接受一个接口作为参数,并且所述接口中有两个方法。
在 kotlin 中,匿名实现接口,我们会有类似的东西
client.execute(object : Callback() {
override fun onResponse(response: Response) {/*...*/}
override fun onError(error: Error) {/*...*/}
})
我想做的是为 client
对象创建一个扩展,该扩展将采用两个不同的接口,例如
interface ClientResponse{fun onResponse(response: Response)}
interface ClientError{fun onError(error: Error)}
然后新的 execute
方法看起来像
client.executeCustom(
{response -> /*...*/},
{error -> /*...*/}
})
真是一种 SAM 解决方案。
有可能吗?
这应该是一个相当简单的扩展,您可以立即获取两个 lambda 参数,然后在其中创建一个 Callback
实例来委托对这些 lambda 的调用:
fun Client.executeCustom(onResponse: (Response) -> Unit, onError: (Error) -> Unit) {
execute(object : Callback() {
override fun onResponse(response: Response) = onResponse(response)
override fun onError(error: Error) = onError(error)
})
}
这样,你甚至不需要引入新的接口。