回调是指一个组件内部呼叫外部的函数,一般有两种,一种是设置回调函数,另一种是继承这个组件(类),然后重写它的对应函数,好像Java所有函数都可以重写,换句话说,所有函数都是C++的虚函数。在Android上编程,感觉,重写on开头的函数是主要的回调方式,你要截获一些动作就必须自己写一个类,继承使用的组件,然后重写这些on函数。从机制上没有什么问题,除了我担心的开销问题,因为Java不得不维护一个巨大的调用关系,子类还有子类,父类还有父类,谁知道谁被重写了呢?都需要记录一下,而且即使一个空函数,也必须有代码,虽然它可能根本没有被调用。当然了,这一点和C++的虚函数机制是相同的,不过C++不是所有的函数都是虚函数。但是使用过程中很多时候,就为了截获一个消息,就不得不写上一大堆的重载函数,好像是必须的,而且必须实现一个继承类,无论从代码量还是视觉上,本来设置一个回调函数,一个语句的事情必须声明一个类,先不考虑执行效率,资源占用,但是阅读代码就很费劲,嵌套太多,缩进也太多,上下来回的拽滚动条,好吧,很多人还喜欢写注释,还喜欢空行。这样一行setOnClickListener函数代码,可能写成10行。而且重载的函数是在那个类里面的,不是在一个层级里面,好在Java运行调用它可见的任何变量(要加上final),要是C++的类,你还不能调内部声明类所在位置的父类的成员。总之,这种重载虚函数的回调机制实际上是非常别扭的方式,包括C++,我觉得虚函数除了增加了学习成本之外(虽然也不是很复杂),还有一大堆的问题。

解决方案 »

  1.   

    java回调机制:
    软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用、回调和异步调用。
    同步调用:一种阻塞式调用,调用方要等待对方执行完毕才返回,它是一种单向调用;
    回调:一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口;
    异步调用:一种类似消息或事件的机制,不过它的调用方向刚好相反,接口的服务在收到某种讯息或发生某种事件时,会主动通知客户方(即调用客户方的接口)。
    回调和异步调用的关系非常紧密:使用回调来实现异步消息的注册,通过异步调用来实现消息的通知。貌似用的人不多,不太熟悉,你还得找找别的帖子
      

  2.   

    java 不光有回调,你为什么不看看反射??