Kotlin:一个返回“this”的默认设置器

时间:2017-05-29 09:13:47

标签: properties return this kotlin setter

我知道这不是“严格按照设计模式”等等等等,但是......

在Kotlin中,有没有办法创建一个返回“this”的“default-ish”设置器,如

var foo:Bar = Something()
    set(f:Bar) {
       foo = f
       return this // Alas, that would not compile because Setter returns Unit
    }

当setter返回this时非常方便,因为可以在不必声明Builder的情况下创建Builder模式。它只是做得更短:

BlahBlah().setFoo(x).setFoo2(y)...

BlahBlah.Builder().setFoo(x)....

var b = BlahBlah()
b.setFoo(x)
b.setFoo2(y)
...

或者其他什么

此外,如果一个setter无论如何返回Unit,为什么不this呢?

3 个答案:

答案 0 :(得分:8)

Kotlin很不错documentation on how to create type safe builders。 Kotlin中的二传手被调用为

receiver.property = value

从setter方法返回this只会有助于从Java使用代码。说过Kotlin setter必须返回Unit。即使没有专门的构建器,在Kotlin上设置几个属性的典型任务也更为简洁:

class BlahBlah {
  var name = "John"
  var age = 12
}

BlahBlah().apply {
  name = "Sarah"
  age = 10
}

答案 1 :(得分:2)

不,这是不可能的:Kotlin的制定者按设计返回单位。

构建器模式的存在是为了克服构造函数参数组合的增加导致构造函数的指数列表的问题。 在Kotlin中,通过使用默认参数值来解决此问题:

data class Foo(
  val a1: String = "a1",
  val a2: String = "a2"
)

现在,您可以通过命名来轻松跳过参数,而不是使用Builder模式:

val foo = Foo(a1 = "bar")

如果你真的想要某种类型的构建器:

class FooBuilder {
    var a1: String = "a1"
    var a2: String = "a2"

    fun build() = Foo(a1, a2)
}

val foo = FooBuilder().apply {
  a1 = "bar"
}.build()

但是,这需要更多代码。

答案 2 :(得分:2)

请查看How to implement Builder pattern in Kotlin?

没有内置机制,但您可以利用apply轻松编写自返回方法:

class Foo {
    var bar: Bar
    fun bar(b: Bar) = apply { bar = b }
}