首先也是最重要的,在大多数情况下,您不需要在 Kotlin 中使用构建器,因为我们有默认参数和命名参数。这使您能够编写
class Car(val model: String? = null, val year: Int = 0)
并像这样使用它:
val car = Car(model = "X")
如果您绝对想使用构建器,可以按以下方法操作:
使构建器成为companion object
没有意义,因为object
s 是单例。相反,将其声明为嵌套类(在 Kotlin 中默认是静态的)。
将属性移至构造函数,以便对象也可以按常规方式实例化(如果不应该,请将构造函数设为私有),并使用带有构建器并委托给主构造函数的辅助构造函数。代码如下所示:
class Car( //add private constructor if necessary
val model: String?,
val year: Int
) {
private constructor(builder: Builder) : this(builder.model, builder.year)
class Builder {
var model: String? = null
private set
var year: Int = 0
private set
fun model(model: String) = apply { this.model = model }
fun year(year: Int) = apply { this.year = year }
fun build() = Car(this)
}
}
Usage: val car = Car.Builder().model("X").build()
该代码可以通过使用另外缩短构建器DSL:
class Car (
val model: String?,
val year: Int
) {
private constructor(builder: Builder) : this(builder.model, builder.year)
companion object {
inline fun build(block: Builder.() -> Unit) = Builder().apply(block).build()
}
class Builder {
var model: String? = null
var year: Int = 0
fun build() = Car(this)
}
}
Usage: val car = Car.build { model = "X" }
如果某些值是必需的并且没有默认值,则需要将它们放入构建器的构造函数中以及build
我们刚刚定义的方法:
class Car (
val model: String?,
val year: Int,
val required: String
) {
private constructor(builder: Builder) : this(builder.model, builder.year, builder.required)
companion object {
inline fun build(required: String, block: Builder.() -> Unit) = Builder(required).apply(block).build()
}
class Builder(
val required: String
) {
var model: String? = null
var year: Int = 0
fun build() = Car(this)
}
}
Usage: val car = Car.build(required = "requiredValue") { model = "X" }