Groovy method with optional parameters

127,509

Solution 1

Can't be done as it stands... The code

def myMethod(pParm1='1', pParm2='2'){
    println "${pParm1}${pParm2}"
}

Basically makes groovy create the following methods:

Object myMethod( pParm1, pParm2 ) {
    println "$pParm1$pParm2"
}

Object myMethod( pParm1 ) {
    this.myMethod( pParm1, '2' )
}

Object myMethod() {
    this.myMethod( '1', '2' )
}

One alternative would be to have an optional Map as the first param:

def myMethod( Map map = [:], String mandatory1, String mandatory2 ){
    println "${mandatory1} ${mandatory2} ${map.parm1 ?: '1'} ${map.parm2 ?: '2'}"
}

myMethod( 'a', 'b' )                // prints 'a b 1 2'
myMethod( 'a', 'b', parm1:'value' ) // prints 'a b value 2'
myMethod( 'a', 'b', parm2:'2nd')    // prints 'a b 1 2nd'

Obviously, documenting this so other people know what goes in the magical map and what the defaults are is left to the reader ;-)

Solution 2

You can use arguments with default values.

def someMethod(def mandatory,def optional=null){}

if argument "optional" not exist, it turns to "null".

Solution 3

Just a simplification of the Tim's answer. The groovy way to do it is using a map, as already suggested, but then let's put the mandatory parameters also in the map. This will look like this:

def someMethod(def args) {
    println "MANDATORY1=${args.mandatory1}"
    println "MANDATORY2=${args.mandatory2}"
    println "OPTIONAL1=${args?.optional1}"
    println "OPTIONAL2=${args?.optional2}"
}

someMethod mandatory1:1, mandatory2:2, optional1:3

with the output:

MANDATORY1=1
MANDATORY2=2
OPTIONAL1=3
OPTIONAL2=null

This looks nicer and the advantage of this is that you can change the order of the parameters as you like.

Share:
127,509
Chris
Author by

Chris

Updated on July 05, 2022

Comments

  • Chris
    Chris almost 2 years

    I would like to write a wrapper method for a webservice, the service accepts 2 mandatory and 3 optional parameters.

    To have a shorter example, I would like to get the following code working

    def myMethod(pParm1='1', pParm2='2') {
        println "${pParm1}${pParm2}"
    }
    
    myMethod();
    myMethod('a')
    myMethod(pParm2:'a') // doesn't work as expected
    myMethod('b','c')
    

    The output is:

    12
    a2
    [pParm2:a]2
    a2
    bc
    

    What I would like to achieve is to give one parameter and get 1a as the result. Is this possible (in the laziest way)?

  • Chris
    Chris over 10 years
    Thanks, thinks looks like a way to go. I'll give it a shot and compare it with the effort when I use NULL values as default for optional parameters. Coming over from the java world I'm quite used to that...
  • Фима Гирин
    Фима Гирин over 7 years
    Am I right, signature of the myMethod should be def myMethod(String mandatory1, String mandatory2, Map map = [:])?
  • tim_yates
    tim_yates over 7 years
    Nope, other way round, as in the answer
  • Krzysztof Wolny
    Krzysztof Wolny over 6 years
    This what he/she already did. The problem is that only last arguments with default values can be omitted.
  • Andreas Covidiot
    Andreas Covidiot about 4 years
  • Sam Liddicott
    Sam Liddicott about 2 years
    I think you got the position of the ? wrong, it should have been: println "OPTIONAL1=${args.optional1?}"
  • Catalin
    Catalin about 2 years
    Your syntax is wrong, because of the last ?