Что такое обратный вызов в java [дубликат]
Возможные Дубликаты:
Что такое функция обратного вызова?
Я прочитал определение обратного вызова в Википедии, но я все еще не получил его. Может ли кто-нибудь объяснить мне, что такое обратный вызов, особенно следующая строка
в компьютерном программировании, обратный вызов-это ссылка на исполняемый код или фрагмент исполняемого кода, который передается в качестве аргумента другой код. Это позволяет более низкоуровневому программный уровень для вызова подпрограммы (или функции), определенной на более высоком уровне.
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", что тесно связано с"асинхронным программированием".
хотя обратные вызовы также используются для имитации методов передачи в качестве параметра, например, что делается в функциональных языках программирования.
Comments