Asif Bakht
Asif Bakht

Reputation: 73

Groovy closure with delegation and dynamic arguments

I have a script where one of the closure delegates with another class object.

Now this closure should take no parameters or multiple parameters and inside code it should access passed delegated object methods

suppose

class Foo {
   public boolean verifyName(String name);
   public boolean verifyNameAndType(String name, PersonType type);
   public boolean verifyNameAndTypeAndAge(String name, PersonType type, int age);
}

class Bar {

def getNames = { String name ->
  if (verifyName(name)){
    // do something
  }
};
def getNames = { String name, PersonType personType -> 
  if (verifyNameAndType(name, personType)) {
    // do something
  }
}
def getNames = { String name, PersonType personType, int age -> 
  if (verifyNameAndTypeAndAge(name, personType, age)) {
    // do something
  }
}

Foo foo = new Foo()
Bar bar = new Bar();
bar.delegate = foo;
Closure NAME = bar.getNames;

NAME closure is available to user where he types 
NAME('shakira');
NAME('affan', DOCTOR);
NAME('siddique', TEACHER, '45455555');

base on parameter it should call specific closure but it seems multiple closure with same name is not allowed.

also user can provide null values inside parameters but still it will call specific closure even if it is null

e.g NAME('shakira', null) should call exact closure getNames(name, personType)

I have already checked this url but my logic will not cover my logical part where User provides null parameters inside method

Groovy Closure with parameters

Upvotes: 1

Views: 801

Answers (1)

daggett
daggett

Reputation: 28564

you can't define several variables with the same name in one class,

however you can define several methods with one name but with different parameters

so your code could look like this:

class Foo {
   public boolean verifyName(String name){println 'verifyName'}
   public boolean verifyNameAndType(String name, String type){println 'verifyNameAndType'}
   public boolean verifyNameAndTypeAndAge(String name, String type, int age){println 'verifyNameAndTypeAndAge'}
}

class Bar {
    @Delegate Foo delegate
    def getNames ( String name ){
        println '1'
        verifyName(name)
    }
    def getNames (String name, String personType ){ 
        println 2
        verifyNameAndType(name,personType)
    }
    def getNames (String name, String personType, int age ){ 
        println 3
        verifyNameAndTypeAndAge(name,personType,age)
    }
}
Foo foo = new Foo()
Bar bar = new Bar(delegate:foo);
Closure NAME = bar.&getNames; // &methodName returns a method closure

//NAME closure is available to user where he types 
NAME('shakira');
NAME('affan', 'DOCTOR');
NAME('siddique', 'TEACHER', 45455555);

Upvotes: 3

Related Questions