使用委派和动态参数进行Groovy闭包

时间:2019-01-30 06:46:03

标签: groovy closures optional-parameters

我有一个脚本,其中一个闭包委托另一个类对象。

现在,此闭包不应包含任何参数或多个参数,并且应在内部代码中访问传递的委托对象方法

假设

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');

应根据参数调用特定的闭包,但似乎不允许使用多个同名闭包。

用户还可以在参数内部提供null值,但即使它为null,它仍然会调用特定的闭包

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

我已经检查了此url,但是我的逻辑不会覆盖用户在方法内部提供空参数的逻辑部分

Groovy Closure with parameters

1 个答案:

答案 0 :(得分:2)

您不能在一个类中定义多个具有相同名称的变量

但是您可以使用一个名称但使用不同的参数定义几种方法

因此您的代码应如下所示:

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);