Позвоните Groovy строитель из Java

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

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

@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.class а также target/classes/com/hello/GroovyGreeting$com/hello/GroovyGreetingBuilder.class, '$' Там действительно странно и мешает ссылаться на него (import com.hello.GroovyGreeting$com.hello.GroovyGreetingBuilder незаконно). Также по какой-то причине в IntelliJ IDEA я могу декомпилировать GroovyGreetingBuilder.class но нет GroovyGreeting.class (нет реакции при попытке открыть его).

1 ответ

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

package alfa.beta

@Builder(builderClassName = 'PageLayoutBuilder')
class PageLayout

Я вижу, что сгенерированный компоновщик теперь называется alfa/beta/PageLayout$PageLayoutBuilder.

Я подал заявку на выпуск JIRA GROOVY-7501 для этого.

Другие вопросы по тегам