最好的Kotlin构建器实现?

  • 本文关键字:实现 构建 Kotlin kotlin
  • 更新时间 :
  • 英文 :


我使用了大量生成的kotlin数据类(openapi生成的),其中包含val和两个可用和处理的公共字段。所以我只能在构造时赋值,比如:

data class StringRepresentation {
val value: String,
val available: Boolean,
val processed: Boolean,
}
data class DoubleRepresentation {
val value: Double,
val available: Boolean,
val processed: Boolean,
}

并且我必须用常见的健壮代码初始化它们中的许多,例如:

val currentRepresentation = StringRepresentation("Something", true, false)

可以使用任何模式或Kotlin语言支持来删除机器人对象初始化吗?使用某种泛型模板方法可能会很棒,比如:

private inline fun  <reified T: StringRepresentation> buildRepresentation(
value: Any,
available: Boolean,
processed: Boolean
): T {
return when(T) {
is StringRepresentation -> StringRepresentation(value.toString(), available, processed)
else -> ...
}
}

,但是我的类型和属性是final的,而且语法也不允许设置多个泛型边界。我不知道该怎么做。我想在这种情况下,我需要写一个构建器,但这似乎是java的方式。

有什么简单的方法可以做到这一点吗?

我不认为这是可能与您的设置编写一个构建器,实际上是有用的。您的*Representation数据类型与各自的类型参数没有显式的类型关系(例如,StringRepresentation不是Something<String>),那么泛型构建器函数的返回类型应该是什么?它只能是Any,您需要将每个结果转换为预期的类型才能使用它。

你能做的是定义一个通用的数据类:

data class Representation<T>(
val value: T,
val available: Boolean,
val processed: Boolean,
)

我知道,你不能使用这个类作为特定数据类的超类,但是你可以编写扩展函数,将一个值类型的泛型表示转换为相应的特定表示:

fun Representation<String>.typed() = StringRepresentation(value, available, processed)
fun Representation<Double>.typed() = DoubleRepresentation(value, available, processed)
然后,您可以使用相同的代码创建任何类型的数据对象:
val stringRepresentation: StringRepresentation = Representation("x", false, true).typed()
val doubleRepresentation: DoubleRepresentation = Representation(1.0, false, true).typed()

但是请注意这仍然不是一个通用的解决方案因为无论您在构造函数Representation中放入什么,都必须分别显式地键入StringDouble

假设你为所有未定义的值类型定义了一个泛型函数:

fun <T: Any> Representation<T>.typed(): Any = error("no typed representation for value type ${value::class}")

上面的特定情况仍然有效,您可以额外编写如下内容:

val x : Any = 2.0
val someRep: Any = Representation(x, true, false).typed()

这在语法上是正确的,并且可以编译,但它不会像期望的那样工作,因为您得到的是一个IllegalArgumentException ("没有值类型类kotlin.Double"的类型表示),因为x的类型不是Double,而是Any

最新更新