Kotlin:一个默认的ish setter,返回“this”

我知道这不是“严格的设计模式”等等等等,但…

在Kotlin中,有没有办法创建一个返回“ this ”的“default-ish”setter,就像

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

管他呢

而且,如果一个二传手返回Unit ,为什么不this呢?

Kotlin 在如何创建类型安全的建设者有很好的文档 。 在Kotlin的制定者被援引为

 receiver.property = value 

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

 class BlahBlah { var name = "John" var age = 12 } BlahBlah().apply { name = "Sarah" age = 10 } 

请看看如何在Kotlin中实现Builder模式?

没有内置的机制,但你可以利用apply来轻松地写出自我返回的方法:

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

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

Builder模式的存在是为了克服构造函数参数组合的增加导致构造函数的指数列表的问题。 在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() 

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