Реализация интерфейсов с замыканиями в Groovy - какой метод был вызван? - PullRequest
3 голосов
/ 04 мая 2009

Существует идиома в groovy для реализации интерфейса с одним замыканием. Замыкание должно быть подготовлено для обработки любых переданных аргументов. Это отлично работает. Но как определить, какой метод был вызван на интерфейсе?

interface X
{ void f(); void g(int n); void h(String s, int n); }

x = {Object[] args -> println "method called with $args"} as X
x.f()

Аргументы доступны, но это имя вызываемого метода - по-видимому - нет. Я что-то упустил?

Ответы [ 3 ]

9 голосов
/ 09 марта 2010

Я думаю, что Майкл Боргвардт по существу прав. Реализация, предоставляемая вами через синтаксис фигурных скобок, обеспечивает реализацию метода , которая используется для ВСЕХ определений интерфейса :

interface X { void f(); void g(int n); void h(String s, int n); }
x = {Object[] args -> println "method called with $args"} as X

x.f()
x.g(5)
x.h("a string",2)

Если вы хотите сделать замыкание с реализацией метода для метода, используйте этот альтернативный синтаксис:

interface X
{ void f(); void g(int n); void h(String s, int n); }

x = [
        f: {println "f is called"},
        g: {int i-> println "g is called with param ${i}"},
        h: {Object[] args -> println "h is called with ${args}"}
] as X

x.f()
x.g(5)
x.h("a string",2)

Для получения дополнительной информации см. Следующее:

1 голос
/ 17 июня 2009

Эта функция предназначена для использования в общем случае интерфейсов с одним методом, таких как Comparable или Runnable (которые в Java часто используются в качестве замены для замыканий).

1 голос
/ 04 мая 2009

Вы можете использовать динамическую функцию MethodMissing, как показано в этом примере http://groovy.codehaus.org/Using+methodMissing+and+propertyMissing

С этим вы можете реализовать запасной метод, который может обрабатывать вызовы к методам интерфейса.

...