Я работаю в среде, где большая часть наших повседневных задач сценариев происходит через вызов удаленных служб, а не работу с базой данных.
Для многих задач написания сценариев я часто использовал Groovy, и одна из самых полезных функций Groovy специально для этой задачи заключалась в том, что она была построена на быстрых сборщиках .
Теперь сборщики Groovy используют несколько возможностей языка Groovy, которые никогда не превратятся в Java.
В частности, сборщики Groovy используют возможности Meta-программирования Groovy, которые скоро появятся в Java.
Однако ключевой особенностью Groovy-строителей является их иерархический подход к построению конструкций.
Это позволяет разработчикам аккуратно и безопасно создавать вложенные древовидные конструкции, которые можно использовать для моделирования всего, от макетов форм UX до XML.
При таком подходе мы, по крайней мере, можем довольно кратко смоделировать, используя лямбда-выражения Java 8
Для моего примера я решил взять достаточно простой файл Maven pom и посмотреть, смогу ли я создать конструктор для этого.
Весь код для сборщика доступен на Github здесь .
Файл pom.xml выглядит следующим образом:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
<? xml version = "1.0" encoding = "UTF-8" ?> < modelVersion >4.0.0</ modelVersion > < groupId >com.github</ groupId > < artifactId >lambda-builder</ artifactId > < version >1.0-SNAPSHOT</ version > < dependencies > < dependency > < groupId >junit</ groupId > < artifactId >junit</ artifactId > < version >4.11</ version > </ dependency > < dependency > < groupId >commons-beanutils</ groupId > < artifactId >commons-beanutils</ artifactId > < version >1.7.0</ version > </ dependency > </ dependencies > < build > < plugins > < plugin > < groupId >org.apache.maven.plugins</ groupId > < artifactId >maven-compiler-plugin</ artifactId > < configuration > < source >1.8</ source > < target >1.8</ target > < fork >true</ fork > < compilerArgument >-proc:none</ compilerArgument > </ configuration > </ plugin > </ plugins > </ build > </ project > |
Вот пример кода для строителя, чтобы построить эту модель:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
MarkupBuilder pom = new XmlMarkupBuilder( true , "pom" ) .at( "xsi:schemaLocation" , "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" ); pom.el( "modelVersion" , "4.0.0" ); pom.el( "groupId" , "com.github" ); pom.el( "artifactId" , "lambda-builder" ); pom.el( "version" , "1.0-SNAPSHOT" ); pom.el( "dependencies" , () -> { pom.el( "dependency" , () -> { pom.el( "groupId" , "junit" ); pom.el( "artifactId" , "junit" ); pom.elx( "version" , version::get); }); pom.el( "dependency" , () -> { pom.el( "groupId" , "commons-beanutils" ); pom.el( "artifactId" , "commons-beanutils" ); pom.elx( "version" , version::get); }); }); pom.el( "build" , () -> { pom.el( "plugins" , () -> { pom.el( "plugin" , () -> { pom.el( "groupId" , "org.apache.maven.plugins" ); pom.el( "artifactId" , "maven-compiler-plugin" ); pom.el( "configuration" , () -> { pom.el( "source" , 1.8 ); pom.el( "target" , 1.8 ); pom.el( "fork" , true ); pom.el( "compilerArgument" , "-proc:none" ); }); }); }); }); |
Несколько замечаний по этому поводу в целом:
- Я создал специальную форму некоторых методов, которая принимает java.util.function.Supplier в качестве параметра и позволяет вам отложить оценку значения до тех пор, пока вы не пройдете по построителю.
- Я избегал метода цепочки (хотя я учел это в конструкторе). Пробуя оба метода, я лично чувствовал, что это намного чище.
- У Java нет всего синтаксического сахара, который есть у Groovy, поэтому я использовал java.lang.Runnable для функционального интерфейса, который уменьшил синтаксис, создавая замыкание, с недостатком, что у вас должен быть дескриптор исходного объекта компоновщика.
Нигде так хорошо, как Groovy строители, но, тем не менее, большой шаг вперед. Не могу дождаться Java 8.
Ссылка: | Шаблон Builder с использованием Java 8 от нашего партнера JCG Джулиана Эксенбергера из блога Dot Neverland . |