我同意 Grzegorz 答案中的数据复制块,但它本质上与使用构造函数创建数据类的语法相同。如果您想使用该方法并保持所有内容清晰易读,您可能会事先计算所有内容并最终将所有值一起传递。
要拥有更像建造者的东西,您可以考虑以下几点:
假设您的数据类是
data class Data(val text: String, val number: Int, val time: Long)
你可以像这样创建一个可变的构建器版本,使用构建方法来创建数据类:
class Builder {
var text = "hello"
var number = 2
var time = System.currentTimeMillis()
internal fun build()
= Data(text, number, time)
}
以及像这样的构建器方法:
fun createData(action: Builder.() -> Unit): Data {
val builder = Builder()
builder.action()
return builder.build()
}
Action 是一个函数,您可以从中直接修改值,createData 之后会直接为您构建一个数据类。
这样,您可以创建一个数据类:
val data: Data = createData {
//execute stuff here
text = "new text"
//calculate number
number = -1
//calculate time
time = 222L
}
没有设置方法,但您可以直接为可变变量分配新值并在构建器中调用其他方法。
您还可以通过为每个变量指定自己的函数来使用 kotlin 的 get 和 set,这样它可以做的不仅仅是设置字段。
也不需要返回当前的构建器类,因为您始终可以访问它的变量。
补充说明:如果您关心,createData 可以缩短为:
fun createData(action: Builder.() -> Unit): Data = with(Builder()) { action(); build() }.
“使用新的构建器,应用我们的操作并构建”