Вызов построителя Groovy из Java

Я пытаюсь использовать Groovy (что для меня ново), чтобы заменить классы объектов значений Java эквивалентом Groovy и, таким образом, получить более чистый и лаконичный код, оставаясь при этом совместимым с остальной кодовой базой Java. (если эта попытка не увенчается успехом, я могу вернуться к Google @AutoValue.)

Объекты значений должны оставаться доступными для создания из кода Java с использованием шаблона построителя. Методы установки должны быть без префикса, и в идеале построитель должен создаваться с помощью статического метода с настраиваемым именем.

В Javadoc @groovy.transform.builder.Builder упоминается, что его можно использовать, «если вам нужна интеграция с 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 (никакой реакции при попытке открыть).


person Sébastien Dubois    schedule 08.04.2015    source источник
comment
Я полагаю, вы пробовали GroovyGreeting.builder().message("foo").build()?   -  person tim_yates    schedule 08.04.2015
comment
Да, это не работает.   -  person Sébastien Dubois    schedule 08.04.2015


Ответы (1)


У меня была точно такая же проблема. Изучив код стратегий Builder, мне удалось заставить его работать, явно указав builderClassName.

package alfa.beta

@Builder(builderClassName = 'PageLayoutBuilder')
class PageLayout

Я вижу, что сгенерированный билдер сейчас альфа/бета/PageLayout$PageLayoutBuilder.

Для этого я отправил JIRA issue GROOVY-7501.

person Controlix    schedule 13.07.2015
comment
Большое спасибо (извините за поздний ответ). У вас случайно нет рабочей установки проекта maven? Больше не могу заставить это работать :/ - person Sébastien Dubois; 11.01.2016