`
wwty
  • 浏览: 542876 次
  • 性别: Icon_minigender_1
  • 来自: 北京-郑州
社区版块
存档分类
最新评论

内部类使用场景二:实现回调函数

阅读更多

首先我们得了解一下什么叫做回调函数:

精妙比喻:回调函数还真有点像您随身带的BP机:告诉别人号码,在它有事情时Call您
回调用于层间协作,上层将本层函数安装在下层,这个函数就是回调,而下层在一定条件下触发回调,例如作为一个驱动,是一个底层,他在收到一个数据时,除了完成本层的处理工作外,还将进行回调,将这个数据交给上层应用层来做进一步处理,这在分层的数据通信中很普遍。
其实回调和API非常接近,他们的共性都是跨层调用的函数。但区别是API是低层提供给高层的调用,一般这个函数对高层都是已知的;而回调正好相反,他是高层提供给底层的调用,对于低层他是未知的,必须由高层进行安装,这个安装函数其实就是一个低层提供的API,安装后低层不知道这个回调的名字,但它通过一个函数指针来保存这个回调,在需要调用时,只需引用这个函数指针和相关的参数指针。
其实:回调就是该函数写在高层,低层通过一个函数指针保存这个函数,在某个事件的触发下,低层通过该函数指针调用高层那个函数。

关于回调的总结:
在Java中,通常就是编写另外一个类或类库的人规定一个接口,然后你来实现这个接口,然后把这个接口的一个对象作为参数传给别人的程序,别人的程序必要时就会通过那个接口来调用你编写的函数。

 

下面使用java回调函数来实现一个测试函数运行时间的工具类:
如果我们要测试一个类的方法的执行时间,通常我们会这样做:
java 代码
public class TestObject {  
    /** 
     * 一个用来被测试的方法,进行了一个比较耗时的循环 
     */  
    public static void testMethod(){  
        for(int i=0; i<100000000; i++){  
              
        }  
    }  
    /** 
     * 一个简单的测试方法执行时间的方法 
     */  
    public void testTime(){  
        long begin = System.currentTimeMillis();//测试起始时间  
        testMethod();//测试方法  
        long end = System.currentTimeMillis();//测试结束时间  
        System.out.println("[use time]:" + (end - begin));//打印使用时间  
    }  
      
    public static void main(String[] args) {  
        TestObject test=new TestObject();  
        test.testTime();  
    }  
}  

大家看到了testTime()方法,就只有"//测试方法"是需要改变的,下面我们来做一个函数实现相同功能但更灵活:
首先定一个回调接口:
java 代码
public interface CallBack {  
    //执行回调操作的方法  
    void execute();  
}  

然后再写一个工具类:
java 代码
public class Tools {  
      
    /** 
     * 测试函数使用时间,通过定义CallBack接口的execute方法 
     * @param callBack 
     */  
    public void testTime(CallBack callBack) {  
        long begin = System.currentTimeMillis();//测试起始时间  
        callBack.execute();///进行回调操作  
        long end = System.currentTimeMillis();//测试结束时间  
        System.out.println("[use time]:" + (end - begin));//打印使用时间  
    }  
      
    public static void main(String[] args) {  
        Tools tool = new Tools();  
        tool.testTime(new CallBack(){  
            //定义execute方法  
            public void execute(){  
                //这里可以加放一个或多个要测试运行时间的方法  
                TestObject.testMethod();
            }  
        });  
    }  
      
}

 

通过上面的文字和代码我们可以理解了什么叫做java的回调。那么我们具体在什么时候使用回调函数呢?

在进行JDBC编程的时候,我们经常要写到try catch语句块,而如果采用回调技术,那么完全可以避免重复的去写,将自己的方法体使用一个回调接口的方法来实现,每次都传到同一个try catch当总,但是每一个方法的内容是不相同的。

再比如算法比较多的情况下,也可以采用这种实现模式来实现。最近看了SWT,发现里面好多的事件驱动都是采用回调来实现的。比如给按钮添加事件:

                            Button okButton = createButton(buttons, "&Ok", "Process input",
                                       new MySelectionAdapter(){
                                           public void widgetSelected(SelectionEvent e)
                                           {
                                               System.out.println("Name:         " + nameField.getText());
                                               System.out.println("Address:      " + addrField.getText());
                                               System.out.println("Phone number: " + phoneField.getText());
                                           }
                                       });

匿名内部类最常用的情况就是在回调当中的精彩表现。

 

回调是一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口.

分享到:
评论
1 楼 Zengchen2 2013-05-16  
讲得很实用

相关推荐

    java 回调函数 实现

    在给定的场景中,我们看到通过接口来实现回调函数的实例。以下是详细的解释和相关知识点: 1. **接口(Interface)**:Java中的接口是定义行为的蓝图,它包含一组未经实现的方法。在回调机制中,接口扮演着关键角色...

    VC++ 回调函数使用实例

    2. **声明回调函数的使用**:接下来,在需要使用回调函数的类或函数中,声明一个接收回调函数参数的函数。例如: ```cpp void ExecuteWithCallback(CallbackType callback) { // 在这里执行某些操作,并在适当的...

    C++回调函数

    3. **重用性**:由于回调函数允许外部代码插入到内部处理流程中,因此可以更容易地实现代码重用。这对于构建库和框架特别有用。 #### 三、回调函数的应用场景 1. **算法实现**:在设计算法时,经常需要根据不同的...

    回调函数demo

    在JavaScript中,你可以这样定义一个回调函数: ```javascript function myCallback(param1, param2) { // 这里是回调函数的实现 } ``` 然后将其作为参数传递给另一个函数: ```javascript function ...

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

    如果由于某种原因(比如代码复用不当或者错误的逻辑控制),`InitializeComponent`方法被无意间调用了两次或多次,而该方法内部又包含了事件预订语句,那么这就会导致回调函数被连续执行两次或多次。 例如: ```...

    帮助理解回调函数的简洁实例

    在给出的链接中,博客文章《通过代码复用的场景理解回调函数是怎么一回事》可能会提供具体的代码示例,展示如何在实际场景中使用回调函数来实现代码复用和功能组合。通过阅读这个例子,你可以更好地理解回调函数的...

    delphi回调函数例子

    在压缩包中的文件,如`Unit1.pas`和`Unit2.pas`,很可能包含了具体实现回调函数的类和方法。`Unit1.dcu`和`Unit2.dcu`是编译后的单元文件,它们包含了编译后的元数据和代码。`Unit1.dfm`和`Unit2.dfm`是表单文件,...

    C#传递回调函数

    3. **传递回调函数:** 然后,我们需要将`MyCallback`方法的引用作为参数传递给ATL的接口方法。这通常在初始化或设置阶段完成。假设ATL有一个名为`SetCallback`的方法接受我们的委托实例,我们可以这样做: ```...

    callback回调函数

    在C++中,如果想要将类成员函数作为回调函数使用,通常需要将其转换为静态函数或者使用lambda表达式,因为非静态成员函数会隐含地接收一个`this`指针,而回调函数通常只接受函数指针。 例如: ```cpp class ...

    vc++回调函数的用法

    #### VC++中回调函数的使用场景 1. **Windows API中的回调函数**:许多Windows API函数都支持回调函数,例如`EnumWindows()`用于枚举窗口,`SetTimer()`用于定时器等。 2. **自定义算法**:在编写自定义算法时,如...

    c/c++回调函数

    在C/C++编程中,**回调函数**是一种非常重要的编程模式和技术,广泛应用于各种场景,如定时器事件处理、进度监控等功能的实现。回调函数的核心在于,它允许程序员在调用一个函数时传递另一个函数的地址作为参数,被...

    回调函数回调函数回调函数

    在C语言中,由于没有内置的高阶函数支持,我们通常使用函数指针来实现回调。一个函数指针变量可以存储一个函数的地址,这样我们就可以在其他地方通过该指针调用该函数。在给定的例子中,`libfun` 函数接受一个名为 `...

    回调函数介绍

    1. **简化程序结构**: 在实现特定功能时,如事件处理、进度监控等,使用回调函数可以使程序结构更加清晰,逻辑更加简洁。 2. **增强灵活性**: 通过传递回调函数,可以让调用方自定义某些行为,从而提高程序的可配置...

    linuxC语言函数指针回调函数教程

    现在,我们来看看`Callback_samplecode.rar`中的示例代码,它可能包含了一些实际应用场景下的回调函数使用,例如在多线程或者信号处理中。通常,你会看到如何将函数指针作为参数传递到其他函数中,然后在那些函数...

    CallBack回调函数

    7. **回调函数与设计模式**:回调函数是观察者模式、发布订阅模式等设计模式的一种实现方式,帮助实现松耦合的系统。 总的来说,回调函数是软件开发中不可或缺的一部分,它提供了处理异步操作和事件响应的有效手段...

    simulink:14 simulink回调函数.zip

    然而,正确使用回调函数需要对Simulink的内部工作原理有深入理解,避免引入不必要的复杂性和性能影响。在实践中,应该注意编写清晰、可维护的代码,并充分测试回调函数,确保其在不同场景下都能正确运行。

    匿名内部类实现接口回调

    这个"匿名内部类实现接口回调"的示例旨在演示如何通过匿名内部类来简化回调函数的实现。下面我们将详细探讨接口回调的概念、匿名内部类的使用以及它们在实际编程中的应用。 首先,让我们理解什么是接口回调。接口回...

    C 语言回调函数详解.pdf

    下面是一个使用函数指针实现回调函数的示例: ```c #include typedef void (*Callback)(int); void doSomething(Callback callback, int data) { printf("开始处理数据:%d\n", data); callback(data); } ...

    delphi 回调函数示例

    本示例将深入探讨 Delphi 中的回调函数,包括其工作原理、使用场景和具体实现。 首先,让我们理解回调函数的基本概念。在 Delphi 中,你可以通过定义一个具有兼容函数指针类型的变量来创建回调函数。这个函数指针...

Global site tag (gtag.js) - Google Analytics