4

我正在尝试使用 Groovy(这对我来说是新的)用 Groovy 等价物替换 Java 值对象类,从而获得更简洁的代码,同时保持与 Java 代码库的其余部分兼容。(如果这次尝试失败,我可能会退回到谷歌@AutoValue。)

值对象应保持可使用构建器模式从 Java 代码实例化。setter 方法应该没有前缀,理想情况下,构建器应该可以通过具有可配置名称的静态方法进行实例化。

@groovy.transform.builder.Builder的 Javadoc 提到它可以在“如果你需要 Java 集成”时使用,我看到它也有配置参数,看起来很有希望,但我没有弄清楚如何从 Java 代码中使用它。

这是一个尝试,我不知道用什么代替 X:

问候.groovy:

import groovy.transform.Immutable
import groovy.transform.builder.Builder

@Immutable
@Builder
public class GroovyGreeting {
  String message
}

GroovyGreetingTest.java:

GroovyGreeting g = X.message("foo").build();

编辑:生成 2 个类,target/classes/com/hello/GroovyGreeting.class并且target/classes/com/hello/GroovyGreeting$com/hello/GroovyGreetingBuilder.class. 那里的'$' 真的很奇怪并且阻止引用它(import com.hello.GroovyGreeting$com.hello.GroovyGreetingBuilder是非法的)。同样出于某种原因,在 IntelliJ IDEA 中我可以反编译GroovyGreetingBuilder.class但不能GroovyGreeting.class(尝试打开它时没有反应)。

4

1 回答 1

3

我有完全相同的问题。在研究了 Builder 策略的代码后,我设法通过显式指定 builderClassName 使其工作。

package alfa.beta

@Builder(builderClassName = 'PageLayoutBuilder')
class PageLayout

我可以看到生成的构建器现在是 alfa/beta/PageLayout$PageLayoutBuilder。

我为此提交了一个 JIRA 问题 GROOVY-7501。

于 2015-07-13T11:31:41.240 回答