Java回调函数理解和应用

#Java回调函数理解和应用
所谓回调:就是A类中调用B类中的某个方法C,然后B类中反过来调用A类中的方法D,D这个方法就叫回调方法,这样子说你是不是有点晕晕的。
在未理解之前,我也是一脸懵逼,等我理解之后,发现和Javascript的回调函数原理基本是一样,一个是将对象作为参数传递,一个是将函数作为参数传递。
从维基百科上面摘抄定义:
在计算机程序设计中,回调函数,或简称回调,是指通过函数参数传递到其它代码的,某一块可执行代码的引用。这一设计允许了底层代码调用在高层定义的子程序。

举个例子有个程序员和一个项目经理,XX项目经理向程序员安排任务让程序员去完成,程序员获得任务并记下是XX项目经理安排的任务,程序员将任务完成后,获取通知XX项目经理的方式,发送一条信息通知项目经理任务已经完成。

下面上实例:
新建一个项目经理类:

public class ProjectManager {
	
	private String name;
	
	public ProjectManager(String name)
	{
		 this.name =name;
	}
	
	public String getName()
	{
		return this.name;
	}
	
	/**
	 * 通知方法
	 * @param msg
	 */
	public void noticeMe(String msg)
	{
		System.err.println(msg);
	}
	
	/**
	 * 安排任务
	 * @param task
	 */
	public void arrange(String task)
	{
		//安排程序员干活
		new Programmer().receiveTask(task, this);
	}
	
	public void doOtherWork()
	{
		System.err.println("项目经理干其他事情...");
	}

}

新建一个程序员类:


import java.util.concurrent.TimeUnit;


public class Programmer {
	
	//记下是XX项目经理,而不是其他项目经理
	ProjectManager manager;
	/**程序员接受任务*/
	public void receiveTask(String task,ProjectManager manager)
	{
		this.manager = manager;
		try {
			//程序员开始执行任务
			this.excuteTask(task);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
	/**执行任务*/
	private void excuteTask(String task) throws InterruptedException
	{
		System.err.println("执行项目经理:"+manager.getName()+"安排的任务-->"+task);
		//任务执行中
		TimeUnit.SECONDS.sleep(1);
		//任务完成
		this.finished(task);
	}
	/**任务完成*/
	public void finished(String task)
	{
		//获取通知项目经理的方法,并发出通知
		//进行函数回调,这里还不算真正的回调
		manager.noticeMe(manager.getName()+"你好,你安排的任务"+task+"已经完成!");
	}
	
}

新建测试类:

public class CallbackTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		ProjectManager prjMgr = new ProjectManager("王响");
		prjMgr.arrange("今晚完成数据库设计...");
		prjMgr.doOtherWork();
	}

}

运行结果:
运行结果

但实际上,项目经理可能有好多个联系方式,有些方式可能是无效的。那我怎样才能知道哪个才是真确的通知方式呢?那就需要项目经理指定哪个方式是正确的,这样程序员也只要记住联系方式即可。在C/C++中,要用回调函数,被掉函数需要告诉调用者自己的指针地址,但在JAVA中没有指针,怎么办?我们可以通过接口(interface)来实现定义回调函数。
定义一个通知接口:

public interface Notice {
	public void noticeMe(String msg);
}

改写项目经理类:

public class ProjectManager implements Notice{

private String name;

public ProjectManager(String name)
{
 this.name =name;
}

public String getName()
{
return this.name;
}

/**
 * 通知方法
 * @param msg
 */
@Override
public void noticeMe(String msg)
{
System.err.println(msg);
}

/**
 * 安排任务
 * @param task
 */
public void arrange(String task)
{
//安排程序员干活
new Programmer().receiveTask(task, this);
}

public void doOtherWork()
{
System.err.println("项目经理干其他事情...");
}

}

改写程序员类

import java.util.concurrent.TimeUnit;


public class Programmer{
	
	//指定了通知方式
	Notice notice;
	/**程序员接受任务*/
	public void receiveTask(String task,Notice notice)
	{
		this.notice = notice;
		try {
			//程序员开始执行任务
			this.excuteTask(task);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
	/**执行任务*/
	private void excuteTask(String task) throws InterruptedException
	{
		System.err.println("执行项目经理:安排的任务-->"+task);
		//任务执行中
		TimeUnit.SECONDS.sleep(1);
		//任务完成
		this.finished(task);
	}
	/**任务完成*/
	public void finished(String task)
	{
		//获取通知项目经理的方法,并发出通知
		//进行回调通知
		notice.noticeMe("你好,你安排的任务"+task+"已经完成!");
	}
	
}

那我们为什么要使用回调函数呢?
简单来说就是,我自己活太多,或者有其他的事需要做,自己不想做,就把这个活分配给别人去完成,并把完成的结果告诉我就行了。

如果看到这里你若还没有懂的话,那我换一种方式表达:回调函数就是别人要调用我的时候,我要告诉别人我这个方法的地址在那里,然后别人直接找这个地址就行,不用再去向系统申请内存地址然后去找(找的过程中,会涉及很多询问,就像我平常生活中找一个不熟悉的人时,就会去询问一些人,告诉被询问者“他是谁,他在哪”)这个方法在哪里。

  • 10
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

chemyoo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值