Java中钩子和抽象方法的区别

时间:2011-01-25 18:36:31

标签: java methods abstract

这是我大学的学习资料中引用的问题。

对我来说完全没有意义。

对于我来说,钩子是(通常是顺序但不仅仅是)程序中的指定点,您可以在其中指定自己的方法或要执行的回调。

例如,一个应用程序有一个“on before before hook”,我可以在那里注册我的回调方法,在关机之前将用户数据保存到磁盘。

抽象方法是自我解释。

对我而言,这是完全不同的东西?或者这些事情中的任何一个都具有我不知道的第二个含义?我做了一个快速搜索,但没有找到任何东西。

6 个答案:

答案 0 :(得分:13)

我真的不认为这两件事非常相似。他们可能相关的一种方式可以通过以下方式证明:

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中覆盖可以更改功能的挂钩,但这些挂钩不是必需的。这与抽象方法类似,因为抽象方法需要来覆盖以定义功能。

答案 1 :(得分:4)

  

对我而言,这是完全不同的东西?

它们都是将代码推迟到客户端类(类的用户)的方法:

1)定义抽象方法

  • 该类中的其他方法调用抽象方法。
  • 该类的客户端必须扩展该类以提供缺少的代码。

2)定义一个钩子

  • 该类具有关联的回调接口(这只是一堆抽象方法)。
  • 该类的方法调用回调方法。
  • 该类的客户端必须实现相关的回调并注册它以提供缺少的代码。

当然,有多种原因会导致您使用一种方法而不是另一种方法。例如,钩子方法允许您注册多个回调。但是抽象方法提供了对类的更直接访问(受保护的方法和ivars)。


这可能是太多的信息,但在Android编程中你会看到两者:

您可以提供CursorAdapter将数据源与UI小部件相关联。

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

这个类是抽象的,有两个方法newViewbindView,它们将数据实际绑定到UI小部件。类必须是子类才能使用此类。


但是,CursorAdapter的子类是SimpleCursorAdapter

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

此类实现newViewbindView,并选择提供客户端可以实现并注册SimpleCursorAdapter实例的ViewBinder接口。 ViewBinder实例必须提供将特定数据绑定到特定UI小部件的setViewValue方法。

SimpleCursorAdapter的一个关键区别是提供ViewBinder是可选的,这是钩子方法的优势之一。

答案 2 :(得分:3)

就个人而言,在询问StackOverflow社区之前,我会去找教授并要求澄清。

...但是,据说,我相信(如果你的钩子的描述是正确的)任何类都可以为钩子注册回调方法,而抽象方法强制子类a实现自己的算法给定的方法。

答案 3 :(得分:3)

确实存在一些概念与实现细节的混淆。

基本上你的理解是正确的。

引用OP的陈述, 是:

  

挂钩是指定的点,开发人员可以指定要执行的方法或回调。

Javascript语言可能是允许所有内容被钩住的最(臭名昭着)语言。 (作为旁注:谷歌有一个安全漏洞,涉及Javascript数组构造函数被挂钩)

实现抽象方法/回调接口是在java代码中实现回调的机制如何

答案 4 :(得分:3)

抽象方法是实现“钩子”的一种方式。钩子可以通过回调,观察者模式,插件来实现......任何方式你都希望指定外部的一些代码在应用程序中的重要点(称为钩子)上运行。

答案 5 :(得分:0)

hook 是一个古老的术语,可能追溯到20世纪80年代之前。从你的问题中不清楚是否"在Java"适用于Hooks和Abstract Methods,但如果我是教授(!),我认为了解钩子的历史(在Java之前)是很重要的。

维基百科页面详细介绍了Hooking。就个人而言,当我想到 hook 时,我想到了允许运行时自定义的机制。

以下是http://www.tldp.org/LDP/Linux-Dictionary/html/h.html

中的一些定义

挂钩

软件或硬件产品中包含的功能,可让爱好者和程序员添加自己的自定义功能。来自QUECID

<磷>氮。包含的软件或硬件功能是为了简化用户以后的添加或更改。例如,打印数字的简单程序可能总是在基数10中打印它们,但更灵活的版本会让变量决定使用哪个基数;将变量设置为5将使程序在基数5中打印数字。变量是一个简单的钩子。更灵活的程序可能会检查变量并将16或更小的值视为要使用的基础,但将任何其他数字视为用户提供的打印数字例程的地址。这是一个毛茸茸但有力的钩子;然后,可以编写一个例程来打印数字作为罗马数字,比如说,或者作为希伯来字符,并通过钩子将其插入程序中。通常,优秀程序和优秀程序之间的区别在于后者在明智选择的位置具有有用的钩子。两者都可以做同样好的原始工作,但是具有钩子的那个可以更灵活地用于未来的功能扩展(例如,EMACS是所有钩子)。用户退出&#39;是同义词,但更正式,更少hackish。来自术语词典

将代码插入系统调用以便更改它的技术。典型的钩子通过将函数指针替换为自己的调用来工作,然后一旦完成它的处理,它就会调用原始函数指针。来自Hacking-Lexicon

对于 Java中的抽象方法,在Bert F's answer中已经很好地解释了它。我强调,与钩子的一般概念(允许自定义)不同,抽象方法需要规范,这意味着没有默认定义。