Groovy的好处:对Fluent API使用Builder AST转换

从Groovy 2.3开始,我们可以使用@Builder AST转换轻松地为我们的类创建一个流畅的API。 我们可以将注释应用于我们的类,并且生成的类文件将具有所有支持流畅API的必要方法。 我们可以自定义如何使用不同的注释参数生成流畅的API。 在Groovy代码中,我们已经可以使用with方法来使用一种干净的方法来设置属性值或使用命名的构造函数参数。 但是,如果需要从Java使用我们的类,那么很高兴为Java开发人员提供Groovy类的流利API。

在以下示例中,我们将@Builder批注Message具有某些属性的简单类Message 。 我们将所有内容保留为默认设置,然后生成的Message类文件将具有一个新的builder方法,该方法将返回一个内部帮助程序类,可用于设置属性。 对于每个属性,它们都是带有属性名称的新方法,因此我们可以设置一个值。 最后,我们的类包含一个build ,该build将返回带有正确属性值的Message类的新实例。

import groovy.transform.builder.Builder

@Builder
class Message {
    String from, to, subject, body
}

def message = Message
        .builder()  // New internal helper class.
        .from('mrhaki@mrhaki.com')  // Method per property.
        .to('mail@host.nl')
        .subject('Sample mail')
        .body('Groovy rocks!')
        .build()  // Create instance of Message

assert message.body == 'Groovy rocks!'
assert message.from == 'mrhaki@mrhaki.com'
assert message.subject == 'Sample mail'
assert message.to == 'mail@host.nl'

如果要更改builder的名称和build方法,可以使用注释参数builderMethodNamebuildMethodName

import groovy.transform.builder.Builder

@Builder(builderMethodName = 'initiator', buildMethodName = 'create')
class Message {
    String from, to, subject, body
}

def message = Message.initiator()
        .from('mrhaki@mrhaki.com')
        .body('Groovy rocks!')
        .create()

assert message.body == 'Groovy rocks!'
assert message.from == 'mrhaki@mrhaki.com'

我们看到,对于每个属性,都会生成一个相应的方法。 我们还可以使用注释参数prefix自定义生成的方法名称的prefix 。 在以下示例中,我们为方法名称定义前缀分配

import groovy.transform.builder.Builder

@Builder(prefix = 'assign')
class Message {
    String from, to, subject, body
}

def message = Message.builder()
        .assignFrom('mrhaki@mrhaki.com')
        .assignBody('Groovy rocks!')
        .build()

assert message.body == 'Groovy rocks!'
assert message.from == 'mrhaki@mrhaki.com'

最后,我们还可以包含和排除需要从我们的流畅API中包含或排除的属性。 我们使用注释参数includesexcludes来定义属性的名称。 这可以是名称的列表或逗号分隔的列表。

import groovy.transform.builder.Builder

@Builder(excludes = 'body' /* or includes = 'from,to,subject' */)
class Message {
    String from, to, subject, body
}

def message = Message.builder()
        .from('mrhaki@mrhaki.com')
        .to('mail@host.nl')
        .subject('Groovy 2.3 is released')
        .build()

assert message.from == 'mrhaki@mrhaki.com'
assert message.subject == 'Groovy 2.3 is released'

try {
    message = Message.builder().body('Groovy rocks!').build()
} catch (MissingMethodException e) {
    assert e.message.readLines().first() ==
            'No signature of method: static Message.body() is applicable for argument types: (java.lang.String) values: [Groovy rocks!]'
}

@Builder AST转换还会检查@Canonical AST转换是否应用于类。 @Canonical转换中定义的任何包含或排除的属性也将包含或排除在生成的构建器代码中。

我们可以使用builderStrategy批注参数定义SimpleStrategy策略。 这样,生成的类将没有单独的内部帮助生成器类和build方法。 默认prefix设置为set ,但是如果需要,我们可以更改它:

import groovy.transform.builder.Builder
import groovy.transform.builder.SimpleStrategy

@Builder(builderStrategy = SimpleStrategy, prefix = 'assign')
class Message {
    String from, to, subject, body
}

def message = new Message()
        .assignFrom('mrhaki@mrhaki.com')  // Method per property.
        .assignTo('mail@host.nl')
        .assignSubject('Sample mail')
        .assignBody('Groovy rocks!')

assert message.body == 'Groovy rocks!'
assert message.from == 'mrhaki@mrhaki.com'
assert message.subject == 'Sample mail'
assert message.to == 'mail@host.nl'

我们将在以后的博客文章中看到@Builder批注的其他功能。

用Groovy 2.3编写的代码。

翻译自: https://www.javacodegeeks.com/2014/05/groovy-goodness-use-builder-ast-transformation-for-fluent-api.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值