从Java调用Groovy构建器

4

我想用Groovy(对我来说是新的)来替换Java值对象类,并获得更清洁、更简洁的代码,同时保持与Java代码库的兼容性。(如果此尝试失败,我可能会退回到Google @AutoValue。)

值对象应该可以使用构建器模式从Java代码中实例化。setter方法不应有前缀,最好可以通过静态方法来实例化构建器并配置名称。

@groovy.transform.builder.Builder的Javadoc提到它可以用于“需要Java集成”的情况,我也看到它有配置参数,这看起来很有前途,但我还没有弄清楚如何从Java代码中使用它。

下面是一种尝试,其中我不知道要用什么替换X:

Greeting.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.classtarget/classes/com/hello/GroovyGreeting$com/hello/GroovyGreetingBuilder.class。其中的'$'很奇怪,阻止了对它的引用(import com.hello.GroovyGreeting$com.hello.GroovyGreetingBuilder 是不合法的)。而且由于某种原因,在IntelliJ IDEA中我可以反编译GroovyGreetingBuilder.class但无法打开GroovyGreeting.class(尝试打开时没有反应)。


我假设你已经尝试过 GroovyGreeting.builder().message("foo").build() 了吗? - tim_yates
是的,那不起作用。 - Sébastien Dubois
1个回答

3

我曾经遇到过完全相同的问题。在研究构建器策略的代码后,我通过明确指定builderClassName来使其正常工作。

package alfa.beta

@Builder(builderClassName = 'PageLayoutBuilder')
class PageLayout

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

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


非常感谢(回复晚了很抱歉)。你是否有一个可用的Maven项目设置?我无法再让它工作了 :/ - Sébastien Dubois

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接