有没有办法为常规脚本指定构造函数?

时间:2019-02-22 16:45:56

标签: groovy

我有一个名为Foo.groovy的常规脚本,可以使用以下语法构造该脚本的实例:

def foo = new Foo()

我知道Foo.groovy的样子:

import groovy.transform.Field

@Field def bar

def someMethod() {
  //...
}

以下语法:

def foo = new Foo(bar: 'baz')

将使用一些默认的构造函数,并将bar字段实际设置为baz, 但假设我想操纵bar的传递值来添加一个 像这样"${bar}!"

希望能够执行以下操作(在AFAIK中无效):

import groovy.transform.Field

@Field def bar

Foo(args) {
  bar = "${args.bar}!"
}

def someMethod() {
  //...
}

是否有一种惯用的方式来实现这一目标?

2 个答案:

答案 0 :(得分:1)

您可以使用setter方法

(Foo.groovy):

import groovy.transform.Field

@Field def bar

void setBar(def bar){
    this.bar = "${bar}!"
    println "Setter is executed. ${bar} -> ${this.bar}"
}

如果主叫方看起来像

import Foo
def foo = new Foo(bar: 'baz')
println foo.bar

出现以下结果:

Setter is executed. baz -> baz!
baz!

答案 1 :(得分:0)

可以从Binding对象中满足脚本主体中的任何自由变量。它的工作原理非常类似于地图,因为它具有基于地图的构造函数,并重载了getProperty和setProperty。 http://docs.groovy-lang.org/latest/html/gapi/groovy/lang/Binding.html

主脚本:

def binding = new Binding(bar: 'baz')
def foo = new Foo(binding)
foo.run()

Foo.groovy:

someMethod(bar + '!')

def someMethod(baz) { // bar/baz value must be passed in
  // do something with baz
}

我还没有尝试过,但是将它插入Groovy Console并查看会发生什么应该足够容易。