嗨,我是Kotlin世界的新手 . 我喜欢到目前为止所看到的并开始考虑将我们在Java应用程序中使用的一些库转换为Kotlin .
这些库充满了带有setter,getter和Builder类的Pojos . 现在我用谷歌搜索了什么是在Kotlin中实施Builders的最佳方法,但没有成功 .
第二次更新:问题是如何在Kotlin中使用一些参数为简单的pojo编写Builder设计模式?下面的代码是我尝试编写java代码然后使用eclipse-kotlin-plugin转换为Kotlin .
class Car private constructor(builder:Car.Builder) {
var model:String? = null
var year:Int = 0
init {
this.model = builder.model
this.year = builder.year
}
companion object Builder {
var model:String? = null
private set
var year:Int = 0
private set
fun model(model:String):Builder {
this.model = model
return this
}
fun year(year:Int):Builder {
this.year = year
return this
}
fun build():Car {
val car = Car(this)
return car
}
}
}
10 回答
我已经看到很多例子宣称额外的乐趣作为建设者 . 我个人喜欢这种方法 . 省力写建设者 .
我还没有找到一种方法可以强制某些字段在DSL中初始化,比如显示错误而不是抛出异常 . 如果有人知道,请告诉我 .
我会说Kotlin的模式和实现几乎保持不变 . 由于默认值,您有时可以跳过它,但是对于更复杂的对象创建,构建器仍然是一个无法省略的有用工具 .
首先,在大多数情况下,您不需要在Kotlin中使用构建器,因为我们有默认和命名参数 . 这使您可以写
并像这样使用它:
如果你绝对想要使用构建器,那么你可以这样做:
使构建器成为
companion object
是没有意义的,因为object
是单例 . 而是将其声明为嵌套类(默认情况下在Kotlin中是静态的) .将属性移动到构造函数,以便也可以以常规方式实例化对象(如果不应该将构造函数设为私有),并使用将构建器和委托作为主构造函数的辅助构造函数 . 代码如下:
用法:
val car = Car.Builder().model("X").builder()
使用builder DSL可以另外缩短此代码:
用法:
val car = Car.build { model = "X" }
如果某些值是必需的并且没有默认值,则需要将它们放在构建器的构造函数中以及我们刚刚定义的
build
方法中:用法:
val car = Car.build(required = "requiredValue") { model = "X" }
因为我使用Jackson库来解析JSON中的对象,所以我需要一个空构造函数,而且我不能有可选字段 . 所有字段都必须是可变的 . 然后我可以使用这个与Builder模式相同的漂亮语法:
我个人从未见过Kotlin的建筑师,但也许只是我 .
所有验证都需要在
init
块中进行:在这里,我冒昧地猜测你并不真的想要
model
和year
可以改变 . 这些默认值似乎没有任何意义,(尤其是null
对于name
)但我留下了一个用于演示目的 .An Opinion: Java中使用的构建器模式,表示没有命名参数的生存时间 . 在具有命名参数的语言(如Kotlin或Python)中,使用具有长列表(可能是可选的)的构造函数是一个好习惯 .
您可以在kotlin示例中使用可选参数:
然后
对于一个简单的类,您不需要单独的构建器 . 您可以使用Kirill Rakhman描述的可选构造函数参数 .
如果你有更复杂的类,那么Kotlin提供了一种创建Groovy样式的Builders / DSL的方法:
Type-Safe Builders
这是一个例子:
Github Example - Builder / Assembler
我在Kotlin中使用以下代码实现了一个基本的Builder模式:
最后
Java的:
科特林:
人们现在应该检查Kotlin的Type-Safe Builders .
使用所述对象创建方式将如下所示:
一个很好的'in-action'用法示例是vaadin-on-kotlin框架,它使用了类型安全的构建器assemble views and components .