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" }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值