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の回答は、可能な解決策のアイデアを与えてくれたパラメーターとしてマップを使用することに良い点がありました。必要なデフォルトでマップを作成し、必要な値をオーバーライドして、それをファクトリ メソッドに渡すことができました。より良いアプローチのヒントが得られない限り、これでおそらくうまくいくでしょう。
以下の私の現在のアプローチ
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 操作 ( << ) は元のマップを変更するため、上記の例では、最後のメソッド呼び出しでも age が 21 になります。私の場合、デフォルト マップはセットアップ メソッドで毎回新しく作成できるため、これは問題ではありません。