如何使用Groovy的@Builder复制POGO?

时间:2015-04-28 15:36:46

标签: groovy copy-constructor builder

Groovy的@Builder注释实际上将构建器模式添加到类,通常是POGO。我想要做的事情类似于以下内容,我认为它类似于复制构造函数。

鉴于现有的课程Foofoo,我想做:

Foo copy = Foo.builder(foo).methodOne(...).methodTwo(...)...build()

也就是说,能够将实例foo传递给builder(),但这不是(当前)API的一部分。我认为如果有一种方法可以将POGO转换为Map,那么就可以构建一个POGO - 但显然不是那么干净。

拥有这样的解决方案还可以让用户通过从现有数据构建新类来解决@Immutable类,而无需手动映射每个属性。

有没有人知道如何实现这个目标?

更新:我知道@Immutable将所有字段设为私有,因此无法将@Immutable@Builder一起使用,因此解决此问题的方法很多如果想要拥有遵循构建器模式的不可变类,那就更棘手了。

1 个答案:

答案 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)'