使用Java 8的Builder模式

我在一个环境中工作,其中通过调用远程服务而不是使用数据库来执行大量日常脚本任务。

对于许多脚本编写任务,我经常使用Groovy,而Groovy专门用于该任务的最有用的功能之一就是它是用流畅的Builders构建的

现在,Groovy构建器利用了一些Groovy语言功能,这些功能永远都不会融入Java中。

最值得注意的是,Groovy构建器利用了Groovy的Meta编程功能,而Java不久就不会使用它。

但是,Groovy构建器具有的一个关键功能是其层次结构构建方法。

这使构建者可以整洁安全地创建嵌套树状结构,这些结构可用于对从UX表单布局到XML的所有内容进行建模。

这种方法至少可以使用Java 8 lambda表达式相当简洁地建模。

对于我的示例,我决定采用一个相当简单的Maven pom文件,并查看是否可以创建一个构建器来处理该文件。

对于制造商的所有代码可在Github 这里

pom.xml文件如下:

<?xml version="1.0" encoding="UTF-8"?>  
 <project xmlns="http://maven.apache.org/POM/4.0.0"  
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
      xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">  
   <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>

这是构建器构建此模型的示例代码:

MarkupBuilder pom = new XmlMarkupBuilder(true, "pom")  
         .at("xmlns", "http://maven.apache.org/POM/4.0.0")  
         .at("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance")  
         .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 ,从而减少了创建闭包的语法,但缺点是必须在初始builder对象上具有一个句柄。

尽管没有Groovy建设者那么出色,但是向前迈出了一大步。 等不及Java 8。

翻译自: https://www.javacodegeeks.com/2014/06/builder-pattern-using-java-8.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值