问题
I have an java interface
public interface IPerson {
Person addPerson(String name );
Person addPerson(String name1,String name2);
Person addPerson(String name,String[] details);
Person addPerson(String name,String name1,String[] details);
Person addPerson(String name,List<String> details);
}
With PersonImpl .java
being:
class PersonImpl implemets Iperson {
..
// and interface methods implemtation
}
and my person.java looks like
class Person {
def firstName;
def lastName;
}
And my PersonTest.groovy
looks like
def PersonImpl person = new PersonImpl();
person.addPerson("anish")
person.addPerson("anish","nath")
person.addPerson("john","smith")
person.addPerson("tim","yates")
def list=[];
list.add("abc")
list.add("qpr")
person.addPerson("anish",list)
person.addPerson("nath","11", [".docsDevNmAccessStatus.1", "Integer", "4"])
person.addPerson("nath","11", [".docsDevNmAccessStatus.1", "String", "4"])
Is there any way to define the DSL for this interface so that i easily called addOperation easily?
The problem is that the IPerson
interface cannot be changed.
how can i write dsl something like
addPerson "anihs" "nath" //call to person.addPerson("anish","nath")
addPerson "tim" "kates"
//simlary of other interface method any suggestion
回答1:
In Groovy something like addPerson "anihs" "nath"
is not really allowed. If you wanted two arguments you would have to use a comma. So the best you can get is addPerson "anihs", "nath"
. But this method calls is just hanging in the air, the context is missing. One quite easy version would be of course:
def PersonImpl person = new PersonImpl();
person.with {
addPerson "anish"
addPerson "anish","nath"
addPerson "john","smith"
addPerson "tim","yates"
def list = ["abc", "qpr"]
addPerson "anish",list
addPerson "nath","11", [".docsDevNmAccessStatus.1", "Integer", "4"]
addPerson "nath","11", [".docsDevNmAccessStatus.1", "String", "4"]
}
though I am not sure this is enough for you.
来源:https://stackoverflow.com/questions/7482933/groovy-closure-for-complex-object-prblm-stateme2