在Groovy中是否可以使用具有默认值的命名参数?我的计划是创建一种对象工厂,可以不带任何参数调用它以获取带有默认值的对象。此外,我需要能够显式设置对象的任何参数。例如,在Python中使用关键字参数就可以实现这一点。
我现在正在尝试的代码类似于以下内容:
// Factory method
def createFoo( name='John Doe', age=51, address='High Street 11') {
return new Foo( name, age, address )
}
// Calls
Foo foo1 = createFoo() // Create Foo with default values
Foo foo2 = createFoo( age:21 ) // Create Foo where age param differs from defaut
Foo foo3 = createFoo( name:'Jane', address:'Low Street 11' ) // You get the picture
// + any other combination available
我正在开发的真实应用程序将有更多的参数,因此需要更多的组合。
谢谢
更新:
我计划使用工厂方法进行测试。不能真正触及Foo类,尤其是它的默认值。
@dmahapatro和@codelarks在下面的回答中提出了使用Map作为参数的好方法,这给了我一个可能解决方案的想法。我可以创建一个具有所需默认值并覆盖所需值的map,并将其传递给工厂方法。这可能会完成任务,我将采用这种方法,除非我得到更好的建议。
我的当前方法如下:
defaults = [ name:'john', age:61, address:'High Street']
@ToString(includeFields = true, includeNames = true)
class Foo {
// Can't touch this :)
def name = ''
def age = 0
def address = ''
}
def createFoo( Map params ) {
return new Foo( params )
}
println createFoo( defaults )
println createFoo( defaults << [age:21] )
println createFoo( defaults << [ name:'Jane', address:'Low Street'] )
注意:左移操作(<<)会修改原始地图,因此在上面的示例中,年龄也将在最后一个方法调用中为21岁。在我的情况下,这不是问题,因为默认地图可以在每次设置方法中重新创建。
defaults
在这种情况下维护状态。将其设为本地的。请查看我的更新。 - dmahapatro