gpt4 book ai didi

Kotlin - 有没有办法用伴随对象中定义的接收器来定义函数的显式范围?

转载 作者:行者123 更新时间:2023-12-02 13:15:26 24 4
gpt4 key购买 nike

假设您有以下代码:

interface SomeClient {

fun isValid(value: String): Boolean
}

class SomeData private constructor(
val value: String
) {

companion object {

fun SomeClient.create(value: String): SomeData? =
if (isValid(value)) {
SomeData(value)
} else {
null
}
}
}

class SomeOtherData private constructor(
val otherValue: String
) {

companion object {

fun SomeClient.create(value: String): SomeOtherData? =
if (isValid(value)) {
SomeOtherData(value)
} else {
null
}
}
}

class SomeUseCase(
someClient: SomeClient
) : SomeClient by someClient {

fun run() {
val someData = SomeData.create("hello")
val someOtherData = SomeOtherData.create("wassup")
}
}
整个意图是提供一个静态工厂方法来创建一个有效的值对象( SomeDataSomeOtherData ),但验证逻辑包括一些 IO 操作。所以我想将创建方法的调用范围限制为实现 SomeClient 的类。 .
这里的问题是编译器无法解析 SomeData#create 内部的伴随对象方法( SomeOtherData#createSomeUseCase#run ) ,它提示接收器不正确。
我当然可以那样做
class SomeUseCase {
fun run() {
val someData = this.createSomeData(...)
val someOtherData = this.createSomeOtherData(...)
}
}
并相应地重命名创建方法,但我想保留名称,所以它将是 SomeData.create ,而不是 SomeData.createSomeData .
有没有办法做到这一点?这有意义吗?

最佳答案

当你写 fun SomeClient.create(value: String)SomeData您未定义的伴随对象 create伴随对象的方法,但是 extension function对于 SomeClient在伴生对象的范围内。
如果你重写它,让它成为伴生对象的方法,你会看到isValid 没有接收者。 () 调用,所以它需要作为参数传递到那里:

class SomeData private constructor(val value: String) {
companion object {
fun create(value: String, validator: SomeClient): SomeData? =
if (validator.isValid(value)) SomeData(value) else null
}
}
之后可以在 SomeClient 的范围内调用它。像那样:
val someData = SomeData.create("hello", this)
重复有点麻烦 this对于每个创建调用,因此您可以为 SomeData 定义扩展函数 SomeClient 范围内的伴生对象界面:
interface SomeClient {
fun isValid(value: String): Boolean

fun SomeData.Companion.create(value: String) = create(value, this@SomeClient)
}
之后可以在 SomeClient 的范围内调用它。以一种期望的方式:
val someData = SomeData.create("hello")

关于Kotlin - 有没有办法用伴随对象中定义的接收器来定义函数的显式范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64594175/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com