如何理解java的回调函数?

2023-05-28 0 939

对控制技术难题,要用是一两件事,认知那个控制技术难题的原委、斯特默原本为甚么要结构设计那个机能、那个控制技术难题有什么样竞争优势、适用于什么样情景又是除此之外两件事了。

前者舒圣祥得其形,前者神形兼具得原意,这也是简而言之铜制与战神的差别。

会采用、又能认知已经难于,如果还能唱出来,讲其他人都能看知道就更不难了。

在软件结构设计那个金融行业,反弹表达式是最常用的机能。在GUI合作开发的时候,每一个按键的点选该事件单厢加进反弹表达式。

甚么是反弹函数?为甚么要用反弹表达式?在java中,为甚么要用USB来同时实现反弹表达式?

这是要弄知道的两个难题!

甚么是表达式初始化?

在搞清楚甚么是反弹表达式以后,先要知道甚么表达式初始化。“初始化”的英文叫“call”,译者回去也叫“发短信”。

发短信不外乎是沟通交流、协同、精心安排一些事,或是更要获得自己想的结论。

程式结构设计就是对现实生活的演示和抽象化,一定要认知这句话,上面我们就演示呵呵。

我发短信(call)给老公,问早上要买些甚么菜回去,老公说买些鱼肉回去早上做糖蒜。我获得了想的结论,这表明我初始化那个表达式获得了想的codice。

演示标识符:

public String callWife(String 甚么菜){ //痛打沟通交流,另行脑补 return “鱼肉”; }

我给小孩发短信,嘱咐他要顺利完成Nomeny之后就可以玩游戏。此次表达式初始化没有codice,就像在表达式体里头写了句”我想你”那样。

演示标识符:

public void callBaby(){ System.out.println(“I miss you”); }

这些都很好认知,可如果一个电话不能达到自己的目的呢?

我给朋友发短信,问甚么时候能约呵呵其它两个朋友一起吃个饭,他说要先给他们沟通交流呵呵甚么时候有时间,沟通交流好了再通知我,具体需要沟通交流多久也不确定。

那个难题就不是一个电话(一次表达式初始化)就能解决难题了,需要再发短信回去(callback)就可以达到自己的目的。

但此处要记住两个关键点:

我发短信给朋友,相当于我调用了表达式callFriend()我接到朋友的通知,相当于朋友初始化了我的一个表达式。我是此次交互的主体。

甚么是反弹表达式?

在英文中,callback是回电话的意思,而在合作开发中callback叫反弹表达式,其实就是回电话的意思,callback这一个单词已经把“反弹”的神唱出来了,作为合作开发者,完全可以按回电话的情景来认知反弹表达式。

仔细咂摸呵呵,回电话那个情景与反弹表达式的采用情景何其像啊!点选一个按键或链接,然后等待数据的返回和界面的刷新,具体等待多久也不确定,可能0.1秒就响应了,也可能5秒之后才响应,总之,响应时间是不确定的,不能让人一直等着,这不就像等一个回电话的过程吗?

上面我用实际标识符演示上面的沟通交流过程

那个过程涉及到我和朋友两个实体类,Me类代表我,Friend类代表我的朋友。

因为我要发短信给朋友和接朋友电话通知,所以Me类有三个机能,也叫行为:给朋友发短信,我们用callFriend(Friend)来表示;接到朋友的通知,我们用noticeMe()表达式来表示;在给朋友发短信和接朋友电话通知之间的这一段时间,我在忙其它的事,我们用doOtherthing()表达式来表示。

朋友要先给其他小伙伴约时间然后给我发短信,所以Friend类也有个表达式order()定义他和其它小伙伴的预约过程,约好时间之后又要给我回电话,所以更要有个参数为Me的对象。

标识符如下,这些标识符是可以直接运行的,并且用数字对程序的运行顺序做了标记。

Me.java的标识符

public class Me { // 给朋友发短信 public void callFriend(Friend friend) throws InterruptedException { System.out.println(“1、我发短信给朋友,让他去约时间”); friend.order(this); doOtherThing(); } // 通知我 public void noticeMe() { System.out.println(“6、我收到了朋友的通知”); } // 忙其它的事去了 public void doOtherThing() { System.out.println(“3、我去忙其它的事…”); } }

Friend.java

public class Friend { //和其他小伙伴约好时间后通知我 public void order(final Me me) throws InterruptedException { System.out.println(“2、朋友接到电话说:我现在就和其他小伙伴约时间,请稍等…”); new Thread(new Runnable() { public void run() { try { System.out.println(“4、朋友正在电话联系中….”); sleep(5000); System.out.println(“5、朋友已经约好了,准备给我回电话”); me.noticeMe(); } catch (InterruptedException e) { e.printStackTrace(); } } }).start(); } }

对这段标识符加以表明:

表达式中采用线程是为了演示朋友的沟通交流过程,在实际应用中多为耗时的操作。“朋友”沟通交流过程与“我”忙其它事是并行的,“我”并没有等待他。

最后,写主程序

//测试反弹的主类 public class Main { public static void main(String[] args) throws InterruptedException { // 创建我和朋友的对象 Me me = new Me(); Friend friend = new Friend(); // 给朋友发短信 me.callFriend(friend); } }

看运行结论

如何理解java的回调函数?

从结论中可以看出,我联系朋友之后就忙其它事了,朋友接到电话之后就去沟通交流,我也不知道他会沟通交流多久,朋友在沟通交流完之后通知我,就完事了。

有主动初始化过程,也有callBack的过程,那个实例已经展示了反弹的全部了,但显然并不完美

试想以下情景:

老板精心安排给员工一个任务,要求顺利完成工作后通知老板父母精心安排你飞机落地后,给他们报个平安。

生活中这样的情景非常多,在实际项目中也是,但是在项目中,我们在每个类中定义一个类似noticeMe()这样的类就不高明了,因为违背了“复用”的程式结构设计原则,虽然同时实现了反弹的机能,但并不是真正意义上的反弹表达式。

所以我们可以对“通知”这一行为进一步抽象化,对行为抽象化当然要采用USB。

具体标识符如下:

/*定义接收通知USB,所有参与者可同时实现此USB以接收通知*/ public interface CallBack { //参与者可以同时实现接收通知的细节 public void receiveNotice(String friendName); }

这里有个参数friendName,朋友通知我的时候,可以通过那个参数传递一些信息,比如他的名字。

Me.java同时实现那个USB后的标识符

public class Me implements CallBack{ // 给朋友发短信 public void callFriend(Friend friend) throws InterruptedException { System.out.println(“1、我发短信给朋友,让他去约时间”); friend.order(this); doOtherThing(); } // public void noticeMe() { // // } // 忙其它的事去了 public void doOtherThing() { System.out.println(“3、我去忙其它的事…”); } // 通知我 public void receiveNotice(String friendName) { System.out.println(“6、我收到了朋友 -“+friendName+ “- 的通知”); } }

Friend.java做相应的修改后:

public class Friend { //和其他小伙伴约好时间后通知我 public void order(final CallBack callBack) { System.out.println(“2、朋友接到电话说:我现在就和其他小伙伴约时间,请稍等…”); new Thread(new Runnable() { public void run() { try { System.out.println(“4、朋友正在电话联系中….”); sleep(5000); System.out.println(“5、朋友已经约好了,准备给我回电话”); callBack.receiveNotice(“张三”); } catch (InterruptedException e) { e.printStackTrace(); } } }).start(); } }

Main.java的标识符不需要调整。

运行结论和前面基本是一致的,我只是增加了一个参数,大家也可以体会一个那个参数带来的便利。

如何理解java的回调函数?

多了一个USB的定义,标识符好像更多了。但在实际扩展当中却更方便了,比如说,老板要接收员工的通知,老板类同时实现那个USB就完事了;父母要等待小孩的通知,父母类同时实现那个USB就可以。换句话说,所有要扩展接收通知的类,只要同时实现那个USB就具备了接收通知的机能。

这样的好处是标识符获得了复用,极大的方便了扩展。

通过USB来同时实现反弹的机能,这才是真正意义上的反弹表达式。

android中的控件点选,都是用反弹表达式来同时实现的,比如Button,View.OnClickListener就是USB,只有一个onClick()表达式,类似上面的receiveNotice()表达式,只是此处用匿名内部类同时实现了那个USB。java虚拟机监听着按键,只要按键被点选,onClick()就会被初始化,而上面的例子是我们在标识符中初始化的,实质并不差别。

button.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { //点选后的具体同时实现 } });

这就是我对反弹表达式的认知,也欢迎与大家就此难题进行交流。

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务