java - 回调代码执行
问题描述
我试图理解 Java 中的回调,但这让我很困惑。我知道回调是通过实现接口作为对象传递的。但我无法理解如何调用参数中传递的那些对象的函数。我举了这个例子
interface ClickEventHandler {
public void handleClick();
}
//Step 2: Create a callback handler
//implementing the above interface
class ClickHandler implements ClickEventHandler {
public void handleClick() {
System.out.println("Clicked");
}
}
//Step 3: Create event generator class
class Button {
public void onClick(ClickEventHandler clickHandler) {
clickHandler.handleClick();
}
}
public class Tester {
public static void main(String[] args) {
Button button = new Button();
ClickHandler clickHandler = new ClickHandler();
//pass the clickHandler to do the default operation
button.onClick(clickHandler);
Button button1 = new Button();
//pass the interface to implement own operation
button1.onClick(new ClickEventHandler() {
@Override
public void handleClick() {
System.out.println("Button Clicked");
}
});
}
}
Output is
```none
Clicked Button
Clicked.
我的意思是调用传递对象的函数,我们需要注册它并调用函数。如果是听众,它是如何工作的?如果有人指导我理解这一点会很有帮助。
解决方案
好吧,您通常会维护一个引用ClickEventHandler
(如果您想支持多个,甚至是一个列表)并在单击按钮时调用该方法。
例子:
class Button {
private ClickEventHandler clickHandler;
public void onClick(ClickEventHandler clickHandler) {
this.clickHandler = clickHandler;
}
public void click() {
if( clickHandler != null ) {
clickHandler.handleClick();
}
}
现在,当您调用onClick()
侦听器时,它只会被注册,并且只会在单击按钮时执行(即您调用该click()
方法)。
推荐阅读
- spring - Spring Boot REST API 生成 404 Not Found
- string - 检索时空格后缺少某些字符串
- android - 如何解决自定义时间选择器中的膨胀异常?
- unix - ¿我如何使用 RegExp 获取两个标签之间的所有文本,然后用另一个文本替换整个块?
- laravel - 方法 Illuminate\\Database\\Query\\Builder::frist 不存在
- android - Room 数据库是否支持实体中的布尔变量?
- video - 如何将 openRTSP 中的 MP4 文件编码优化到与 FFmpeg 相同的级别?
- list - 将值添加到列表中的所有整数
- wowza - wowza中查询字符串参数返回null
- forms - 如何检测网页上是否存在表单元素