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

2022-09-03 18:05:21

这是我大学学习材料中引用的一个问题。

这对我来说完全没有意义。

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

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

抽象方法是自我解释的。

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


答案 1

我真的不认为这两件事非常相似。它们可以相关的一种方式可以在下面演示:

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


答案 2

对我来说,这是完全不同的东西吗?

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

1) 定义一个抽象方法

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

2) 定义钩子

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

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


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

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

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

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


但是,的子类是CursorAdapterSimpleCursorAdapter

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

此类实现并选择提供一个接口,客户端可以实现该接口并将其注册到 SimpleCursorAdapter 实例。实例必须提供将特定数据片段绑定到特定 UI 小组件的方法。newViewbindViewViewBinderViewBindersetViewValue

与的一个关键区别是,提供 a 是可选的,这是 hook 方法的优点之一。SimpleCursorAdapterViewBinder