Groovy-закрытие vs методы-разница

enter image description here

Если вы внимательно посмотрите на изображение, вы заметите, что вы можете рефакторировать Groovy-код с помощью Eclipse IDE и преобразовать метод в закрытие и наоборот. Итак, что же такое закрытие и чем оно отличается от метода? Может ли кто-нибудь привести хороший пример использования закрытия, а также почему это полезная функция? Анонимные внутренние классы были недостаточно хороши?

2 ответов


закрытие-это экземпляр класса закрытия, который реализует логику вызова. Он может передаваться как аргумент или присваиваться переменной. Он также имеет некоторую логику, связанную с доступом к переменной области и делегированием вызовов.

методы обычного методы Java. Ничего особенного.

и да, анонимные внутренние классы имеют много шаблонного кода для выполнения простых действий.

сравниваем:

button.addActionListener(
  new ActionListener() {
     public void actionPerformed( ActionEvent e ) {
          frame.dispose();
     }
  }
);

vs

button.addActionListener { frame.dispose() }

там это вопрос о так Groovy: закрытие или методы и 3 ссылки на руководство пользователя, содержащее много полезной информации.

  1. http://groovy.codehaus.org/Closures
  2. http://groovy.codehaus.org/Closures + - + формальное + определение
  3. http://groovy.codehaus.org/Closures + - + неофициальный + руководство

кроме того, поскольку замыкания являются объектами первого класса, их можно передавать, возвращать и управлять. Подумайте:

def add = { n, m -> n + m }
def add2 = add.curry( 2 )

assert add2( 4 ) == 6

def makeAdder = { n ->
    // return a Closure
    { m -> n + m }
}
def anotherAdd2 = makeAdder( 2 )

assert anotherAdd2( 4 ) == 6