Groovy的@Builder
注释实际上将构建器模式添加到类,通常是POGO。我想要做的事情类似于以下内容,我认为它类似于复制构造函数。
鉴于现有的课程Foo
,foo
,我想做:
Foo copy = Foo.builder(foo).methodOne(...).methodTwo(...)...build()
也就是说,能够将实例foo
传递给builder()
,但这不是(当前)API的一部分。我认为如果有一种方法可以将POGO转换为Map
,那么就可以构建一个POGO - 但显然不是那么干净。
拥有这样的解决方案还可以让用户通过从现有数据构建新类来解决@Immutable
类,而无需手动映射每个属性。
有没有人知道如何实现这个目标?
更新:我知道@Immutable将所有字段设为私有,因此无法将@Immutable
与@Builder
一起使用,因此解决此问题的方法很多如果想要拥有遵循构建器模式的不可变类,那就更棘手了。
答案 0 :(得分:1)
您是一位专注的建筑师,您正在寻找什么?
import groovy.transform.builder.*
import groovy.transform.*
@ToString
@Builder
class Foo {
String first, last
int born
Foo(){}
@Builder(builderClassName='CopyBuilder', builderMethodName='copyBuilder')
static Foo copy(Foo foo) {
new Foo(first: foo.first, last: foo.last, born: foo.born)
}
}
def p = Foo.builder().first('Johnny').last('Depp').born(1963).build()
def c = Foo.copyBuilder().foo(p).build()
assert c != p
assert p.toString() == 'Foo(Johnny, Depp, 1963)'
assert c.toString() == 'Foo(Johnny, Depp, 1963)'