kas*_*tti 23 groovy named-parameters keyword-argument
是否可以在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
Run Code Online (Sandbox Code Playgroud)
我正在开发的真正应用程序将拥有更多参数,因此需要更多组合.
谢谢
更新:
我计划的工厂方法是用于测试目的.无法真正触及实际的Foo类,尤其不是它的默认值.
下面的@dmahapatro和@codelarks在使用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'] )
Run Code Online (Sandbox Code Playgroud)
注意: leftShift操作(<<)修改原始地图,因此在上面的示例中,age也将在最后一次方法调用中为21.在我的情况下,这不是问题,因为每次在setup方法中都可以新创建默认映射.
dma*_*tro 31
Groovy默认为你做这件事(map构造函数).您不需要工厂方法.这是一个例子
import groovy.transform.ToString
@ToString(includeFields = true, includeNames = true)
class Foo{
String name = "Default Name"
int age = 25
String address = "Default Address"
}
println new Foo()
println new Foo(name: "John Doe")
println new Foo(name: "Max Payne", age: 30)
println new Foo(name: "John Miller", age: 40, address: "Omaha Beach")
//Prints
Foo(name:Default Name, age:25, address:Default Address)
Foo(name:John Doe, age:25, address:Default Address)
Foo(name:Max Payne, age:30, address:Default Address)
Foo(name:John Miller, age:40, address:Omaha Beach)
Run Code Online (Sandbox Code Playgroud)
更新
@codelark的占星术:).如果无法访问类来设置默认值,您可以这样做
@ToString(includeFields = true, includeNames = true)
class Bar{
String name
int age
String address
}
def createBar(Map map = [:]){
def defaultMap = [name:'John Doe',age:51,address:'High Street 11']
new Bar(defaultMap << map)
}
println createBar()
println createBar(name: "Ethan Hunt")
println createBar(name: "Max Payne", age: 30)
println createBar(name: "John Miller", age: 40, address: "Omaha Beach")
//Prints
Bar(name:John Doe, age:51, address:High Street 11)
Bar(name:Ethan Hunt, age:51, address:High Street 11)
Bar(name:Max Payne, age:30, address:High Street 11)
Bar(name:John Miller, age:40, address:Omaha Beach)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
17603 次 |
| 最近记录: |