【发布时间】:2013-08-02 20:13:49
【问题描述】:
是否可以在 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 answere 很好地使用了 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'] )
注意: leftShift 操作 (
【问题讨论】:
-
不要那样做。
defaults在这种情况下保持状态。让它成为本地的。查看我的更新。 -
我确实意识到了这一点,因此在我的更新中添加了注释。无论如何,使用函数 local map 作为默认值是一种更好的方法。感谢您的提示。
标签: groovy named-parameters keyword-argument