1. Введение
Во многих языках программирования присутствует концепция обратных вызовов функции. Существуют указатели функций в C и C ++, поэтому функции могут быть переданы в качестве параметров для других функций для последующего вызова. В JavaScript обратные вызовы функции доставляются до крайности. Обработка различных событий, особенно асинхронных событий, в основном завершена обратными вызовами функций.
В Java также могут быть реализованы обратные вызовы функций. Хотя нет указателя функции, Java может получить метод класса с помощью механизма отражения, передайте его другим функциям в виде параметра типа java.lang.reflect.method, а затем вызовите функцию через метод Invoke объекта метода.
Тем не менее, вызовые шаги таким образом относительно громоздки, неэффективны в исполнении и трудно отлаживать. В Java существует механизм, который более элегантен, чем обратные вызовы функций, то есть интерфейсы.
2. Зачем нужны обратные вызовы функции
Обратные вызовы функций на самом деле являются способом задержать реализацию определенных функций.
Если мы заранее знаем, какие операции должна выполнять программа, то вообще нет необходимости в образец функций, и она может быть реализована непосредственно во время программирования.
Но много раз при написании кода, особенно при написании классов инструментов, функциональных библиотек или фреймворков, реализуются относительно общие и абстрактные функции, в то время как функции в конкретных сценариях реализованы разработчиками, использующими эти классы.
Обратные вызовы функций могут решить эту ситуацию, когда вы не знаете конкретную реализацию заранее.
Примеры сортировки функций
Например, когда мы хотим реализовать общую функцию сортировки, мы заранее не знаем, какие типы элементов будут использовать другие разработчики для сортировки, и мы не знаем, какие стандарты для оценки частичного порядка (размер) этих элементов.
Следовательно, другие разработчики могут потребоваться для обеспечения функции сравнения при использовании функций сортировки, чтобы мы могли использовать сравнение для сравнения размера элементов, которые необходимо сортировать, не зная заранее, какой тип элементов или конкретной реализации сравнения.
Здесь функция сравнения является функцией обратного вызова для функции сортировки.
Псевдокод представлен следующим образом:
// Общая функция сортировки void sort (object [] array, method compare) {// Использование функции сравнения для сравнения размера взаимосвязи элементов в массиве // Сортировать массив} // Конкретная функция сравнения реализована с помощью Caller int (объект A, объект B) {// Элементы A и B и B -возврат отношения}Пример асинхронных функций обработки
Например, когда мы пишем асинхронную функцию обработки, мы заранее не знаем, что должны делать другие разработчики, когда обработка завершена, потому что эти операции могут быть известны только при использовании функции в определенном сценарии.
Следовательно, разработчики могут быть обязаны предоставить обратный вызов обратного вызова при использовании этой функции. Таким образом, когда мы пишем асинхронные функции обработки, мы можем вызвать функцию обратного вызова, чтобы выполнить некоторую окончательную работу, не зная, какова эта окончательная работа заранее.
Псевдокод представлен следующим образом:
// Async Processing Function void asynprocess (метод обратный вызов) {// Выполнить асинхронное обратное задание ();} // Конкретная функция обратного вызова void обращение () реализуется абонентом {//, которые будут выполнены после выполнения асинхронной обработки}3. Используйте интерфейс вместо обратного вызова функции
Мы упомянули выше, что причина, по которой используется обратный вызов функции, заключается в том, что мы не знаем конкретную реализацию определенных функций заранее, поэтому конкретная реализация остается другим разработчикам для завершения.
Как вы думаете, это предложение, кажется, описывает интерфейс Java? Интерфейс является абстрактным определением набора методов, а конкретная реализация завершается классом, который реализует интерфейс.
Следовательно, используя две характеристики объектно-ориентированных и ориентированных на интерфейс, можно заменить обратные вызовы функций.
Мы приводим два примера выше, чтобы проиллюстрировать, как интерфейс заменяет обратный вызов функции.
Сортировки функций
Используя интерфейс для реализации функции сортировки, больше не требует, чтобы разработчики обеспечивали сравнение функции обратного вызова при использовании функции сортировки, но требуют, чтобы разработчики гарантировали, чтобы элементы были сортированы, реализуя сопоставимый интерфейс. Основываясь на предпосылке, что «сортированные элементы уже реализовали сопоставимый интерфейс», мы можем реализовать функцию сортировки, не зная типа элементов, которые будут отсортированы.
// Общая функция сортировки void sort (object [] array) {// Использовать метод сопоставимого интерфейса // Сравните размер элементов для сортировки массива. } // интерфейс, определяемый с помощью функции сортировки, публичный интерфейс, сопоставимый {public int compareto (объект другой);} // Реализация сопоставимого интерфейса Элемент открытого класса. Сопоставимые {@Override public int compareto (объект другой) {// Судить о отношениях текущего размера между элементом и другими // и возвращают отношения между ними}}}}}}}}}}}}}}}}}}}}}Асинхронные функции обработки
При использовании интерфейсов для реализации асинхронных функций обработки разработчик не требует обратного вызова функции обратного вызова, но требует объекта, который реализует указанный интерфейс, который хорошо отражает идею, ориентированную на Java. По сравнению с предоставлением функции, объект содержит больше информации и является более гибким в использовании. Но по сути, эта асинхронная функция обработки по -прежнему использует интерфейс для завершения завершения.
//Async processing function void asynProcess(ActionListener al) { //Execute asynchronous tasks al.actionPerformed();}//Interface defined by asynchronous processing function public interface ActionListener { void actionPerformed();}//Implement ActionListener interface public class ExtraTask implements ActionListener { @Override public void actionPerformed() { //Extra Работа, необходимая, когда завершается функция асинхронной обработки}} // Вызов асинхронной функции обработки Public Static void Main (String [] args) {asynprocess (new Extratask ());}4. Резюме
Метод обратного вызовов может быть обобщен как: реализация общей функции функции. При вызове этой общей функции в конкретном сценарии звонящий должен предоставить подходящий обратный вызов обратного вызова. Общая функция Func использует эту функцию обратного вызова для выполнения задач в определенных сценариях.
Способ реализации интерфейса: реализовать общую функцию. При вызове этой общей функции в конкретном сценарии управляемый объект должен реализовать соответствующий интерфейс сам по себе. Общая функция будет использовать этот интерфейс для выполнения задач в конкретном сценарии.
Использование обратных вызовов функции или интерфейсов может решить ситуацию, когда вы не знаете конкретную реализацию заранее. Метод обратного вызова функции передает функцию, в то время как метод интерфейса передает объект, который реализует интерфейс.
В Java необходимо выполнить обратные вызовы функций с использованием механизмов отражения, которые подвержены ошибкам и неэффективны. Использование интерфейсов может сделать логику кода более четкой, эффективной и проще в отладении.
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.