【发布时间】:2021-02-12 01:51:40
【问题描述】:
假设您有以下代码:
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")
}
}
整个意图是提供一个静态工厂方法来创建一个有效的值对象(SomeData,SomeOtherData),但验证逻辑包括一些 IO 操作。因此,我想将调用 create 方法的范围限制为实现 SomeClient 的类。
这里的问题是编译器无法解析SomeUseCase#run内部的伴随对象方法(SomeData#create,SomeOtherData#create),它抱怨接收器不正确。
我当然可以这样做
class SomeUseCase {
fun run() {
val someData = this.createSomeData(...)
val someOtherData = this.createSomeOtherData(...)
}
}
并相应地重命名创建方法,但我想保留名称,所以它是SomeData.create,而不是SomeData.createSomeData。
有没有办法做到这一点?这有意义吗?
【问题讨论】: