`

关于java中的回调函数

    博客分类:
  • Java
阅读更多

最近学习内部类的时候,对java实现回调函数机制有了进一步了解,自己整理点比较,希望大家可以相互讨论。
所谓回调,就是允许客户类通过内部类引用来调用其外部类的方法,这是一种非常灵活的功能。
由于java暂时还不能显示支持闭包(Closure),不过听说新版可以支持了,不过我还没用过。现在暂时用的是非静态内部类实现回调功能。

情形一:
假设有一个老师Teacher对象,平时的工作是上课,周末的工作在家干农活(乡村老师大部分都这样),方法名都是work,但功能都不一样,可以用内部类实现这种需求:

public class Teacher {
	// 正常的工作
	public void work() {
		System.out.println("平常我在给学生教课");
	}

	// 业余的工作
	public void farming() {
		System.out.println("周末我在农田忙活");
	}

	private class Farmer {
		// 非静态内部类回调外部类实现work方法,
                // 非静态内部类引用的作用仅仅是向客户提供一个回调外部类的途径
		public void work() {
			farming();
		}
	}

	public Farmer getCallbackReference() {
		return new Farmer();
	}

	public static void main(String[] args) {
		Teacher t = new Teacher();
		// 直接调用work
		t.work();
		// 表面上调用的是Farmer的work方法,实际上是回调Teacher的farming方法
		t.getCallbackReference().work();
	}
}

情形二:
Swing中响应按钮点击事件,使用匿名内部类,各个不同的控件发生事件后可以回调外部类中对应的处理方法。

public class ButtonFrame extends JFrame {
	// 红色按钮
	private JButton redButton = new JButton("Red Button");
	// 蓝色按钮
	private JButton blueButton = new JButton("Blue Button");

	// 处理红色按钮的方法
	private void processRedButton() {
		System.out.println("红色按钮被点击了");
	}

	// 处理蓝色按钮的方法
	private void processBlueButton() {
		System.out.println("蓝色按钮被点击了");
	}

	public ButtonFrame() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		redButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				// 回调ButtonFrame中处理红色按钮的方法
				processRedButton();
			}
		});
		blueButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				// 回调ButtonFrame中处理蓝色按钮的方法
				processBlueButton();
			}
		});
		getContentPane().add(redButton);
		getContentPane().add(redButton);
	}

	public static void main(String[] args) {
		new ButtonFrame().setVisible(true);
	}
}

最后,顺便提一下C语言中实现这种回调的机制,就是利用函数指针的方式实现的。在《Pointers On C》这本书里面举了一个例子很详细的说明这个问题:

要编写一个类型无关的函数,在一个链表中查找一个指定的值,这个链表的数据元素可以是整数,也可能是字符串等,所以函数的参数就不能特定类型,C语言里面有个void类型,可以指向任何类型,通过这个,可以编写一个与类型无关的链表查找函数:

/**
* 在一个单链表中查找一个指定值的函数。它的参数是一个指向链表第1个节点的指针,
* 一个指向我们需要查找的指针和一个函数的指针,它所指向的函数用于比较存储于链表
* 中的类型的值
*
*/

#include ;
#include ;

/*类型无关的链表查找*/
Node * search_list() (Node *node, void const *value,
	int (*compare) (void const *, void const *)) {
		while (node != NULL) {
			if (compare( &node->value, value) == 0) {
				break;
			}
			node = node->link;
		}
		return node;
	}

 

 

本人博客已搬家,新地址为:http://yidao620c.github.io/

分享到:
评论

相关推荐

    java 回调函数 实现

    在Java编程中,回调函数是一种设计模式,它允许一个对象在另一个对象执行特定操作后接收通知或进行处理。这种机制通常用于事件驱动编程或者异步编程中,使得代码能够响应某些特定事件的发生。在给定的场景中,我们...

    java中回调函数的简单实现

    在Java编程中,回调函数是一种设计模式,它允许我们在代码执行过程中插入自定义的行为,特别是在异步编程或者事件处理中非常常见。回调函数的核心思想是将一个函数作为参数传递给另一个函数,然后在适当的时候由被...

    java自定义回调函数

    Java自定义回调函数是软件开发中的一个重要概念,尤其是在Android和SDK开发中,它极大地提高了代码的灵活性和可扩展性。回调函数允许一个方法在完成特定操作后通知另一个方法,这种设计模式在异步编程和事件处理中...

    java回调函数

    Java回调函数是编程中一种非常重要的设计模式,它允许一个对象在另一个对象完成特定操作后进行通知或执行相应的处理。这种机制使得代码更加灵活,解耦了调用者和被调用者的依赖关系,通常用于事件处理、异步编程、...

    Java面试如何用Java实现一个回调函数

    Java面试如何用Java实现一个回调函数

    [iOS]Objective-C利用协议实现回调函数(类似java的回调函数)

    在标题提及的“[iOS]Objective-C利用协议实现回调函数(类似java的回调函数)”中,我们主要讨论的是Objective-C如何通过协议(Protocol)来实现类似于Java中的回调函数功能。这种机制对于异步编程、事件处理以及...

    Java多线程实现回调函数.txt

    Java多线程实现 自定义 的 回调函数. 手写 完成,亲测 完成,可以 直接运行,Demo ,具有一定参考价值,供大家阅读 下载,谢谢

    Android回调函数的例子

    本示例将深入探讨Java回调函数,并通过一个Android小程序来展示其用法。 首先,理解Java回调函数的基础概念。回调函数本质上是将一个函数作为参数传递给另一个函数,待特定条件满足或特定事件发生时,被调用的函数...

    JNA 回调函数不稳定现象处理 文件

    JNA 回调函数工作不稳定现象处理 (绝大多数回调不稳定的原因)

    亲测可用,java 成功调用dll函数。包含调用回调函数,springboot版本。最近由于公司业务需要,要调用dll文件,用JNA调用。

    在Java通过JNA调用DLL时,如果DLL函数需要一个回调函数作为参数,那么Java需要定义一个接口,该接口的方法将作为回调函数的实现,JNA会处理这个接口的调用转换。 4. **Spring Boot**:Spring Boot是基于Spring框架...

    回调函数被连续执行两次或多次的原因

    在这个例子中,`InitializeComponent`方法被调用了两次,导致`MyEvent`事件的事件预订也发生了两次,进而使得`HandleEvent`回调函数被执行了两次。 #### 解决方案 为了避免回调函数被连续执行,可以采取以下几种...

    Java回调函数的理解

    ### Java回调函数的理解 #### 一、回调函数的概念与应用场景 在计算机编程中,回调是一种常用的编程模式,尤其是在异步编程场景中。简单来说,回调指的是一个函数或方法被另一个函数调用,作为参数传递进去。这种...

    android回调函数

    在Android开发中,回调函数是一种常见的编程模式,用于在特定事件发生时通知并允许其他对象进行相应的处理。回调函数在Android中的应用广泛,比如在异步任务完成、用户界面更新或者网络请求完成时,都会用到回调。...

    Android回调函数demo

    在Android开发中,回调函数(Callback Function)是一种重要的设计模式,它允许代码在特定事件发生时执行自定义操作。回调函数通常与接口结合使用,使得一个类能够接收并处理另一个类的通知。在这个“Android回调...

    Java 回调函数详解及使用

    Java 回调函数详解 前言: C语言中回调函数解释: 回调函数(Callback Function)是怎样一种函数呢? 函数是用来被调用的,我们调用函数的方法有两种:  直接调用:在函数A的函数体里通过书写函数B的函数名来调用...

    java CallBack(回调函数)

    Java回调函数,也称为Callback机制,是面向对象编程中一种重要的设计模式,它允许一个对象在其他对象执行特定操作后得到通知或者进行后续处理。在Java中,回调通常通过接口来实现,因为Java不支持函数指针。让我们...

    Java回调函数详解共6页.pdf.zip

    Java回调函数是编程中一种常见的设计模式,它允许一个对象在其他对象完成特定操作后进行通知或介入。这种模式在Java中广泛应用于事件处理、异步编程和接口交互。本资料"Java回调函数详解共6页.pdf.zip"将深入探讨这...

    java中的回调函数.docx

    Java中的回调函数是一种设计模式,它允许一个对象在特定事件发生时调用另一个对象的方法。在Java中,回调机制通常通过接口实现,因为Java不支持像C++那样的指针。以下是对回调函数及其在Java中如何工作的详细说明: ...

    回调函数java.rar

    回调函数在Java编程中是一种常见的设计模式,它允许我们将一个函数作为参数传递给另一个函数,以便在特定事件发生或特定操作完成后执行。这种模式在异步编程、事件处理和框架设计中尤为常见。理解并熟练运用回调函数...

    java 回调函数的理解

    2. 生命周期管理:回调函数中的对象需要妥善管理,防止内存泄漏。 五、实例解析 以下是一个简单的回调函数示例,展示了如何通过接口实现回调: ```java public interface Callback { void onTaskCompleted(String...

Global site tag (gtag.js) - Google Analytics