首先,在大多数情况下,您不需要在Kotlin中使用构建器,因为我们有默认和命名参数 . 这使您可以写
class Car(val model: String? = null, val year: Int = 0)
并像这样使用它:
val car = Car(model = "X")
如果你绝对想要使用构建器,那么你可以这样做:
使构建器成为 companion object 是没有意义的,因为 object 是单例 . 而是将其声明为嵌套类(默认情况下在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)
}
}
用法: val car = Car.Builder().model("X").builder()
使用builder 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)
}
}
用法: 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)
}
}
用法: val car = Car.build(required = "requiredValue") { model = "X" }