Функции обратного вызова в Java

170
задан Ozair Kafray 20 July 2012 в 10:44
поделиться

5 ответов

Если Вы имеете в виду что-то как.NET анонимный делегат, я думаю, что анонимный класс Java может использоваться также.

public class Main {

    public interface Visitor{
        int doJob(int a, int b);
    }


    public static void main(String[] args) {
        Visitor adder = new Visitor(){
            public int doJob(int a, int b) {
                return a + b;
            }
        };

        Visitor multiplier = new Visitor(){
            public int doJob(int a, int b) {
                return a*b;
            }
        };

        System.out.println(adder.doJob(10, 20));
        System.out.println(multiplier.doJob(10, 20));

    }
}
153
ответ дан Gant 23 November 2019 в 20:48
поделиться

Метод (еще) не является первоклассным объектом в Java; Вы не можете передать указатель функции как обратный вызов. Вместо этого создайте объект (который обычно реализует интерфейс), который содержит метод, Вы нуждаетесь и передаете это.

Предложения по закрытиям в Java— который обеспечил бы поведение, Вы смотрите for— были сделаны, но ни один не будет включен в предстоящий выпуск Java 7.

5
ответ дан erickson 23 November 2019 в 20:48
поделиться

Когда мне нужен этот вид функциональности в Java, я обычно использую Шаблон "наблюдатель" . Это действительно подразумевает дополнительный объект, но я думаю, что это - очевидный способ для движения и является широко понятым шаблоном, который помогает с удобочитаемостью кода.

4
ответ дан MattK 23 November 2019 в 20:48
поделиться

Немного придирки:

Мне кажется, что люди предлагают создать отдельный объект, но это кажется overkill

Передача обратного вызова включает создание отдельного объекта практически на любом объектно-ориентированном языке, поэтому его вряд ли можно считать излишеством. Вероятно, вы имеете в виду, что в Java требуется создать отдельный класс, который является более подробным (и более ресурсоемким), чем в языках с явными функциями или замыканиями первого класса. Однако анонимные классы, по крайней мере, уменьшают многословность и могут использоваться встроенными.

16
ответ дан 23 November 2019 в 20:48
поделиться

Проверьте замыкания, как они реализованы в библиотеке lambdaj. На самом деле их поведение очень похоже на поведение делегатов C #:

http://code.google.com/p/lambdaj/wiki/Closures

4
ответ дан 23 November 2019 в 20:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: