Kotlin:returns "this" 的默认 setter

Kotlin: A default-ish setter that returns "this"

我知道这不是 "strictly by the design pattern" blah blah blah,但是...

在 Kotlin 中,有没有一种方法可以创建 "default-ish" setter returns "this",例如

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

当一个setter return this时非常方便,因为这样就可以创建一个Builder模式而不需要声明一个Builder。它只是更短:

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

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

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

或者随便什么

此外,如果 setter returns Unit 无论如何,为什么不 this 也一样?

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

receiver.property = value

从 setter 方法返回 this 仅在代码从 Java 使用的情况下才有帮助。话虽如此,Kotlin setter 必须 return Unit。即使没有专门的构建器,在对象上设置多个属性的典型任务在 Kotlin 中也更加简洁:

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

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

不,那是不可能的:Kotlin 的设置器 return 设计单位。

Builder 模式的存在是为了克服构造函数参数组合的增加导致构造函数呈指数级增长的问题。 在 Kotlin 中,这个问题通过使用默认参数值来解决:

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

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

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()

但是,这需要更多的代码。

请看

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

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