Разница между хуками и абстрактными методами в Java - PullRequest
13 голосов
/ 25 января 2011

Это цитируемый вопрос из учебных материалов моего университета.

Это не имеет для меня никакого смысла.

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

Например, у приложения есть «включено до завершения подключения», я могу зарегистрировать свой метод обратного вызова, который сохраняет пользовательские данные на диск до завершения работы.

Абстрактные методы говорят сами за себя.

Для меня это что-то совершенно другое?или у любой из этих вещей есть второе значение, о котором я не знаю?Я сделал быстрый поиск, но ничего не нашел.

Ответы [ 6 ]

13 голосов
/ 25 января 2011

Я действительно не считаю эти две вещи очень похожими. Один из способов их взаимосвязи может быть продемонстрирован в следующем:

public abstract class AbstractActionDoer() {
    public void doAction(Action act) {
        beforeAction();
        act.do();
        afterAction();
    }
    protected abstract void beforeAction();
    protected abstract void afterAtion();
}

public class DefaultActionDoer() extends AbstractActionDoer {
    public void doAction(Action act) {
        beforeAction();
        act.do();
        afterAction();
    }
    // default empty implementation
    protected void beforeAction() { }
    protected void afterAtion() { }
}

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

4 голосов
/ 25 января 2011

Для меня это что-то совершенно другое?

Это оба метода для передачи кода клиентскому классу (пользователю вашего класса):

1)Определите абстрактный метод

  • Другие методы в классе вызывают абстрактные методы.
  • Клиенты класса должны расширять класс для предоставления отсутствующего кода.

2) Определить ловушку

  • У класса есть связанный интерфейс обратного вызова (который представляет собой просто набор абстрактных методов).
  • Методы класса вызывают методы обратного вызова.
  • Клиенты класса должны реализовать соответствующий обратный вызов и зарегистрировать его, чтобы предоставить отсутствующий код.

Конечно, существует множество причин, по которым вы используете один подход по сравнению сДругой.Например, хук-подход позволяет зарегистрировать несколько обратных вызовов.Но абстрактный подход обеспечивает более прямой доступ к классу (защищенные методы и ivars).


Это, вероятно, слишком много информации, но в программировании для Android вы видите оба:

Вы можетепредоставить CursorAdapter для связывания источника данных с виджетом пользовательского интерфейса.

http://developer.android.com/reference/android/widget/CursorAdapter.html

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


Однако подклассом CursorAdapter является SimpleCursorAdapter

http://developer.android.com/reference/android/widget/SimpleCursorAdapter.html

Этот класс реализует newViewи bindView и выбирает интерфейс ViewBinder, который клиенты могут реализовать и зарегистрировать в экземпляре SimpleCursorAdapter.Экземпляр ViewBinder должен предоставлять метод setViewValue, который привязывает определенный фрагмент данных к определенному виджету пользовательского интерфейса.

Одно ключевое отличие с SimpleCursorAdapter состоит в том, что предоставление ViewBinder является необязательным, чтоодно из преимуществ крюкового подхода.

4 голосов
/ 25 января 2011

Лично я бы пошел к профессору и попросил разъяснений, прежде чем спрашивать сообщество StackOverflow.

... но, как говорится, я считаю (если ваше описание хука правильное), что любоекласс может зарегистрировать метод обратного вызова для ловушки, тогда как абстрактный метод заставляет дочерний класс a реализовать собственный алгоритм для данного метода.

3 голосов
/ 25 января 2011

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

3 голосов
/ 25 января 2011

Определенно была некоторая связь понятий с деталями реализации.

В основном, ваше понимание верно.

Чтобы процитировать утверждение ОП, , что :

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

Язык Javascript, пожалуй, самый (общеизвестный) язык, позволяющий подключить все. (В качестве примечания: у Google была дыра в безопасности, связанная с подключением конструктора Javascript Array)

Реализация абстрактного метода / интерфейса обратного вызова - это механизм как обратный вызов реализуется в коде Java.

0 голосов
/ 13 февраля 2017

A hook - это старый термин, вероятно, датируемый до 1980-х годов. Из вашего вопроса не ясно, применимо ли «на Java» и к Хукам, и к абстрактным методам, но если бы я был профессором (!), Я бы подумал, что важно понимать историю хуков (до Java).

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

Вот несколько определений, найденных на http://www.tldp.org/LDP/Linux-Dictionary/html/h.html

Крючок

Функция, включенная в программный или аппаратный продукт, позволяющая любителям и программистам добавлять свои собственные пользовательские функции. От QUECID

крюк

п. Программная или аппаратная функция включена для упрощения последующих дополнений или изменений пользователем. Например, простая программа, которая печатает числа, может всегда печатать их в базе 10, но более гибкая версия позволит переменной определять, какую базу использовать; установка переменной в 5 заставит программу печатать числа в базе 5. Переменная является простым хуком. Еще более гибкая программа может исследовать переменную и рассматривать значение 16 или меньше как основу для использования, но обрабатывать любое другое число как адрес предоставленной пользователем подпрограммы для печати числа. Это волосатый, но мощный крючок; затем можно написать подпрограмму для печати чисел, скажем, римскими цифрами или ивритскими символами, и подключить ее к программе через хук. Часто разница между хорошей программой и превосходной заключается в том, что последняя имеет полезные хуки в разумно выбранных местах. Оба могут выполнять первоначальную работу примерно одинаково хорошо, но тот, у которого есть хуки, гораздо более гибок для будущего расширения возможностей (например, EMACS - это все хуки). Термин «пользовательский выход» является синонимом, но гораздо более формальным и менее хакерским. Из жаргонного словаря

крюк

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


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

...