Что такое обратный вызов в java [дубликат]


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

Я прочитал определение обратного вызова в Википедии, но я все еще не получил его. Может ли кто-нибудь объяснить мне, что такое обратный вызов, особенно следующая строка

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

6   51   2012-01-05 05:11:42

6 ответов:

может пример поможет.

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

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

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

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

в 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);
}

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

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

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

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

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

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

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

в Java, методы обратного вызова в основном используются для решения "Шаблон Observer", что тесно связано с"асинхронным программированием".

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