Что такое обратный вызов в java

Возможный дубликат:
Что такое функция обратного вызова?

Я прочитал определение обратного вызова wikepedia, но я до сих пор его не понимаю. Кто-нибудь, пожалуйста, объясните мне, что обратный вызов, в частности, строка "В компьютерном программировании обратный вызов является ссылкой на исполняемый код или кусок исполняемого кода, который передается как аргумент другому коду. Это позволяет программному уровню более низкого уровня вызывать подпрограмму (или функцию), определенную на уровне более высокого уровня.".

Ответ 1

Может быть, пример поможет.

Ваше приложение хочет загрузить файл с удаленного компьютера, а затем записать на локальный диск. Удаленный компьютер - это другая сторона модемного соединения и спутниковая связь. Задержка и время передачи будут огромными, и у вас есть другие дела. Итак, у вас есть функция/метод, который будет писать буфер на диск. Вы передаете указатель на этот метод в свой сетевой API вместе с удаленным URI и другими материалами. Этот сетевой вызов возвращает "немедленно", и вы можете делать другие вещи. Через 30 секунд первый буфер с удаленного компьютера поступает на сетевой уровень. Затем сетевой уровень вызывает функцию, которую вы передали во время установки, и поэтому буфер записывается на диск - сетевой слой "перезвонил". Обратите внимание, что в этом примере обратный вызов будет происходить в потоке сетевого уровня, чем исходный поток, но это не имеет значения - буфер все еще записывается на диск.

Ответ 2

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

Пол Якубик, Реализация обратного вызова в С++.

Ответ 3

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

В Java одним очевидным примером является java.util.Comparator. Обычно вы не используете Comparator напрямую; скорее, вы передаете его в некоторый код, который вызывает Comparator в более позднее время:

Пример:

class CodedString implements Comparable<CodedString> {
    private int code;
    private String text;

    ...

    @Override
    public boolean equals() {
        // member-wise equality
    }

    @Override
    public int hashCode() {
        // member-wise equality 
    }

    @Override
    public boolean compareTo(CodedString cs) {
        // Compare using "code" first, then
        // "text" if both codes are equal.
    }
}

...

public void sortCodedStringsByText(List<CodedString> codedStrings) {
    Comparator<CodedString> comparatorByText = new Comparator<CodedString>() {
        @Override
        public int compare(CodedString cs1, CodedString cs2) {
            // Compare cs1 and cs2 using just the "text" field
        }
    }

    // Here we pass the comparatorByText callback to Collections.sort(...)
    // Collections.sort(...) will then call this callback whenever it
    // needs to compare two items from the list being sorted.
    // As a result, we will get the list sorted by just the "text" field.
    // If we do not pass a callback, Collections.sort will use the default
    // comparison for the class (first by "code", then by "text").
    Collections.sort(codedStrings, comparatorByText);
}

Ответ 4

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

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

http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/Future.html

Ответ 5

Концепция callback function не существует в Java, потому что в Java нет функций, только методов объектов. Однако бывают ситуации, когда вы можете говорить о callback object или callback interface.

Например, когда вы вызываете объект ArrayList для сортировки, и вы поставляете компаратор, который знает, как сравнивать объекты, содержащиеся в списке, ваш код является уровнем высокого уровня, который вызывает более низкий уровень (стандартный объект списка времени выполнения java), снабжая его интерфейсом к объекту, который находится на вашем (высоком уровне) уровне. Затем список будет "переадресовывать" ваш объект, чтобы выполнить ту часть задания, которая не знает, как это сделать, а именно сравнить элементы списка. Таким образом, в этом случае компаратор можно рассматривать как объект обратного вызова.

Ответ 6

В Java методы обратного вызова в основном используются для обращения к Pattern наблюдателя, который тесно связан с "Асинхронным программированием".

Хотя обратные вызовы также используются для имитации методов передачи в качестве параметра, например, того, что делается на языках функционального программирования.