Позвоните 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 для этого.