android builder模式 插件,如何在Kotlin中实现Builder模式?

首先,在大多数情况下,您不需要在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" }


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部